指针、引用与形实参传值

样例程序:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值