样例程序:
#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++引入的概念,功能可以认为与指针等价。所以输出的结果与指针一致。