您的位置:首页 > 其它

指针、引用与形实参传值

2010-04-15 19:22 127 查看
样例程序:

#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa n)
{
n.a=0;
n.c=0;
n.d=5;
}
struct aa edit(struct aa n)
{
n.a=5;
n.c=10;
n.d=n.a+n.c;
return n;
}

void main()
{
struct aa mm,nn,bb;
init(mm);
bb=edit(nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}

编译输出:
5
-858993460
-858993460

两个疑问:1、为什么init(mm)没有改变mm的值;2、nn.a的输出为什么是随机数

解答:1、当init()函数被调用时,要在栈里创建一个struct aa n的局部变量。然后main()中调用的init()只是修改了局部变量n,并没有修改main()定义的mm。

2、同理1

利用指针修改样例程序:

#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa *n)
{
n->a=0;
n->c=0;
n->d=5;
}
struct aa edit(struct aa *n)
{
n->a=5;
n->c=10;
n->d=n->a+n->c;
return *n;
}

void main()
{
struct aa mm,nn,bb;
init(&mm);
bb=edit(&nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}

输出:

5

5

5

此时,init(mm)已经修改了mm的值,这是因为使用指针做形参时,init()作用的是main()中传入的地址,所以init()修改的是main()

中的变量。edit()同理。

利用引用修改样例程序

#include<stdio.h>
struct aa
{
int a;
int c;
int d;
int k;
int m;
};
void init(struct aa& n)
{
n.a=0;
n.c=0;
n.d=5;
}
struct aa edit(struct aa& n)
{
n.a=5;
n.c=10;
n.d=n.a+n.c;
return n;
}

void main()
{
struct aa mm,nn,bb;
init(mm);
bb=edit(nn);
printf("%d/n%d/n%d",bb.a,mm.d,nn.a);
}
输出:

5

5

5

输出结果与指针的输出结果一致。&是C++引入的概念,功能可以认为与指针等价。所以输出的结果与指针一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: