作者walm20 (New CygnusX)
看板C_and_CPP
标题Re: [问题] 双重指标
时间Thu Feb 19 11:53:44 2009
课本范例:
For call by addr.
void f(int *a)
{
*a=10;
}
void main()
{
int b=5;
f(&b); //把b记忆体位址,传入f
}
不能拿以下例子去判断变数传递方式是不是call by addr. or value吧?
void f(int *a)
{
a=new int (10);
}
void main()
{
int b=5;
f(&b);
}
存取的变数根本就不一样了 (上面是存取addr point到的变数,下面是存取pointer)
--
我的露天拍卖:
http://tinyurl.com/6z4rw7
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.118.126.177
※ 编辑: walm20 来自: 140.118.126.177 (02/19 11:54)
※ 编辑: walm20 来自: 140.118.126.177 (02/19 11:58)
1F:→ windincloud:我觉得你第二个例子这样两者都不算才对~ 02/19 13:15
2F:→ windincloud:call by val. addr.应该是要成立在传入副函式且不改其 02/19 13:16
3F:→ windincloud:值的使用, 你这样写 反而是新开空间给a了~ b有传没传 02/19 13:17
4F:→ windincloud:都一样~ :p 02/19 13:17
5F:→ walm20:你这样讲 是假设你在main里面想改的是b的值 02/19 13:28
6F:→ walm20:若我想改b的位址 那就是call by value 02/19 13:28
※ 编辑: walm20 来自: 140.118.126.177 (02/19 13:30)
7F:推 VictorTom:Call by xxx是看参数的传递方式, 不是看参数怎麽做存取. 02/19 14:00
8F:→ VictorTom:而且您的第二个例子只会造成mem leak没有其他作用@_@" 02/19 14:02
9F:→ VictorTom:它不会改变b, 也跟参数call by xxx没什麽直接的关系. 02/19 14:03
10F:→ walm20:我以为大家焦点只会在call by xxx,所以就不写delete 02/19 14:09
11F:→ VictorTom:重点不是delete, 而是第二个例子变成和b完全没有关系. 02/19 14:11
12F:→ walm20:那您的意思应该是说 市面上有写到call by addr的书是错的 02/19 14:11
13F:→ walm20:应该改为call by value搂? 02/19 14:11
14F:→ VictorTom:传了b的address进来没有使用, 这没解释param passing @@ 02/19 14:12
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我是觉得这句话跟以下例子矛盾 (即CBV)
void f(int a)
{
a=10;
}
void main()
{
int b=5;
f(a);
}
个人浅见 :p
15F:→ VictorTom:很吊诡的是CbA这种讲法我现在看到两种对立的解释.... 02/19 14:13
16F:→ VictorTom:一种是C语言老式的"pass the address by value"的作法 02/19 14:14
17F:→ VictorTom:一种就是说Call by Reference是Call by Address.... 02/19 14:15
18F:→ VictorTom:在原文的资料里目前小弟找不到具体讲Call by Address的. 02/19 14:15
19F:→ VictorTom:所以个人觉得搞清楚CbV, CbR, 而by Address尽量不要讲. 02/19 14:15
20F:→ VictorTom:或者如果板上有先进有更明确的资料能提供的愿闻其详:) 02/19 14:16
※ 编辑: walm20 来自: 140.118.126.177 (02/19 14:23)
※ 编辑: walm20 来自: 140.118.126.177 (02/19 14:25)