请高手们说说c语言中传别名与传地址的具体区别,请看下面的程序。。

#include <iostream>
using namespace std;
//定义一个结构体
typedef struct node
{
int x;
}*tree;

void test(tree t) //定义一个函数,用地址做参数,分配地址,然后赋值
{
t=(tree)malloc(sizeof(node));
t->x =4;
printf("%d\n",t->x );
}
int main()
{
tree a=(tree)malloc(sizeof(node));
a->x =3; //先给a 分配地址,赋值3
test(a); //将a地址传入函数,想给a重新分配地址,然后赋值4
cout <<a->x;
}
它输出的值为:4和3,这个我还能理解,但是我把test函数改为void test(tree &t) //传别名,它的输出的值怎么又成了4和4?传别名跟传地址到底有什么区别呢??

首先函数调用在传参的时候都是值传递。先看在main函数早那个调用void test(tree t)时是把a的值传个了这个函数,在void test(tree t)这个函数中t值被改变,但a的值没有变,所以a依然指向你在main函数中分配的那个地址空间。所以输出为4和3。再看函数改为void test(tree &t)时,这时的形参定义为引用类型,要传的参数是实参的引用,即实参的地址。在main函数中调用void test(tree &t)时是把a的地址传个了这个函数,这样在这个函数中修改t的值也会引起a的值的改变,这样这个函数调用后a指向的地址是在test函数中分配的地址,所以输出为4和4。void test(tree &t)的写法等同于
void test(tree *t);函数具体定义为:
void test(tree *t)
{
(*t)=(tree)malloc(sizeof(node));
(*t)->x =4;
printf("%d\n",(*t)->x );
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-02
传值,函数会另分配内存空间,然后将参数的值复制到此内存空间,对新的内存空间操作,不改变原变量的值
传址,函数传递原变量的内存地址,然后对该地址的值进行操作,也就改变原变量的值
不知道我说的明白不明白?追问

谢谢。。。不太明白。。前者不也是传的址吗,怎么说是传的值呢?

第2个回答  2011-05-02
传值的时候变量前加了&就是引用传值,它带回函数的是一个地址,而不是值。
第3个回答  2011-05-02
tree a=(tree)malloc(sizeof(node));
a->x =3; //先给a 分配地址,赋值3
test(a); //这一句把a的空间重新分配,也就是把3消除了,然后你又给他赋值为4.这时a->x=4.
第4个回答  2011-05-02
让我想想追问

谢谢,在线等。。。。

相似回答