C里面的值传递和地址传递有什么区别?

hoofi 2002-11-17 09:44:10
如果不对形参本身操作,上面两种方式传递有什么不一样么?
两种传递在那些用法上面有不一样的地方?
...全文
307 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
一闻 2002-11-18
  • 打赏
  • 举报
回复
1、这个问题的实质其实很清晰,传递的时候,系统都把参数拷贝一份然后传递给函数,无论是值传递或者地址传递。
2、所以,在函数中改变参数的值,就相当于在改变实参数的拷贝(地址也一样)的值。
3、对于指针,指针拷贝的那份和原来的那份所"指向的变量"都是一样的,比如: &b 指向 b,拷贝一份后(&b2 = &b),那么&b2也指向b,所以改变*&b2,也就是改变b的值,但直接改变&b2,却并不会改变&b,也就是不会改变b的地址!

以上是我学了指针一年后才有的真正了解。
hxy_sss 2002-11-18
  • 打赏
  • 举报
回复
值传递实际上是值拷贝。
地址传递与上面差不多。
wuyixy1 2002-11-18
  • 打赏
  • 举报
回复
在函数行参中,如果用的是值传递,这时如果要把修改以后的值传到函数外面,必须用return语句。如果用的是地址传递,则在函数中对其修改就直接对于该存储单元进行修改,修改就对函数外同样有效。
hoofi 2002-11-18
  • 打赏
  • 举报
回复
估计这种鸟问题不需要深究!
ddmpqcw 2002-11-18
  • 打赏
  • 举报
回复
void foo1(X v){
...;
}

foo1采用值传递,它的运行机制:
X x;
foo1(x);
被转换为:
X x;
X _temp_v.X::X(x);
foo1(_temp_v);
其中_temp_v.X::X(x);//包含一个copy constructor 的调用操作,这是关键,差别主要体现在这里,如果X的结构比较复杂的话,这样做就不好。

你可以使用 foo1(X&x)来代替。它的效率和使用传址是一样的!
Raser 2002-11-18
  • 打赏
  • 举报
回复
据说地址传递效率比较高
qhgary 2002-11-18
  • 打赏
  • 举报
回复
地址传递其实也是copy了一份,直传递也copy了一份,只是一个copy的是value,一个copy的是address。没有什么区别。只是由于copy的是address,所以在使用的时候一旦改变其所指的内容,跟着就都变,给分。
970361 2002-11-18
  • 打赏
  • 举报
回复
foo(char *p)
{
p++;
p++ ;
}
main()
{
char *p = "hello world" ;
char *p1 = p ;
foo(p1) ;
printf("%s",p1);
}
shanweibing 2002-11-17
  • 打赏
  • 举报
回复
值传递只能返回一个值,而地址传递则不同。
iamxia 2002-11-17
  • 打赏
  • 举报
回复
如果传递的是大内容,比如大的结构等建议用地址
dximg 2002-11-17
  • 打赏
  • 举报
回复
c 语言只有值传递,无地址传递!

所谓的地址也只是一个值,并不能
改变其本身,只能改变其指向的
内容。
zjw2723114 2002-11-17
  • 打赏
  • 举报
回复

性能上,大不一样
ice119103 2002-11-17
  • 打赏
  • 举报
回复
因为条用函数的返回值是单向的,所以要用传值改变参数的值,用传值就不可以
iamxia 2002-11-17
  • 打赏
  • 举报
回复
如果不对形参本身操作,没什么不同,只是方法而已

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧