现在的位置: 首页 > 综合 > 正文

return是传值还是传地址的?

2018年04月15日 ⁄ 综合 ⁄ 共 1647字 ⁄ 字号 评论关闭
return是传值还是传地址的?                              蓝森林 http://www.lslnet.com 2006年6月6日 10:18

在函数里使用return来返回一个,是把这个值复制一份给接受参数,还是只是传地址,使二者指向同一块内存?
它到底是传值还是传地址的?:(


本质上都是传值,指针地址也是值.


-->

显然是传值。如果你在函数里定义了一个比如 int ret; 最后你 return ret; 函数退出后,原本在堆栈的 ret 所在地址已经非法。


-->

可以先去弄清楚两个问题::D
1、返回值一般放在哪儿。
2、较“大”的返回值和较“小”的返回值有什么区别。


看你返回的是不是局部变量了,如果是局部变量,当然非法,
如果是动态分配的就没有问题,只不过要记得FREE掉,


-->

返回局部变量的地址非法。


C语言是无法真正传址的,只能传值,要看你把这个值如何看待了,你把它当成一个地址,它就是地址。


记得函数的参数是可以传递struct的
那能不能return一个struct?
这样应该算传值了吧


-->
可以


除非是 C++ 函数,指明返回引用之外,都是 pass-by-value 的。引用基本属于 pass-by-address,里外共享一块地址


那到底什么时候传值,什么时候传地址呢?
例如:

char *
testFun(void)
{
    char *p;
   
    p = (char *)malloc(20);
   
    return p;
}

然后调用testFun,
如:
   char *pTest;
     pTest = testFun();

请问,pTest指针的值也就是pTest这个指针变量中的值 与 testFun函数中的局部变量 p 的值是否一样的?
 如果是一样的,就非常好理解,那是传值,return 把 p 的值复制一份给了 pTest.
但如果是传地址的话就不一样了,testFun调用完了,pTest就是无效指针了
  
  我在 AIX 上碰到过很多次这样的问题,函数内部的指针不能往外传,否则就直接 core dump了


对于这些问题的讨论完全没有意义,

想知道答案,做些练习, objdump 来看一看就一清二楚, 胜过别人的千言万语


不同意楼上的说法,多讨论是有好处的,可以多发现问题,知道自己的不懂之处,当然,不经思考的提问是不可取的。


-->

偏执狂的人几乎从来不参与讨论


知道清朝为什么灭亡,中国近代为什么落后吗?就是因为闭关锁国的!


-->

KAO~

这里谈论的是技术,不谈论国家


简单地说:永远是值。

地址也是值。


-->

Maybe a sketch map can say more.


-->

Maybe a sketch map can tell more:


昨天将书又翻了一下。觉得在绝大多数情况下传的都是值。因为传指针时也是将一个指针的“值”传给另一个指针。但是有一种情况不一样。那就是函数的返回值类型为引用且函数为左值时。这时函数的返回值为一个变量的别名,可以对其进行赋值。如下:
[code]#include <iostream>
using namespace std;

int &min(int &i, int &j);
int main()
{
  int a, b;
  a = 3;
  b = 5;
  min(a, b) = 10;
  cout<<"a = "<<a<<'/t'<<"b = "<<b<<endl;
  a = 8;
  b = 7;
  min(a, b) = 10;
  cout<<"a = "<<a<<'/t'<<"b = "<<b<<endl;
  return 0;
}
int &min(int &i, int &j)
{
  if (i < j)
    return i;
  else
    return j;
}
[/code]
这样第一次调用时返回的引用为a,所以赋值相当于 a = 10;第二次为 b = 10;这种情况下传的即不是值(值不能被赋值),也不是地址(引用只是一个别名,没有另外的地址空间),相当于传的就是一个变量。
但是如果返回值为引用但不是左值时,传的仍然是值。
总的来说,除了返回值为引用且为左值时,传递的是一个变量的别名外,其他情况传递的都是值。

抱歉!评论已关闭.