关于传值调用和传址调用的说明

  刚学习C语言的时候就对传值和传址很模糊,感觉书上说的不是很明白(因为我很笨)

程序在执行的时候,首先是将程序放入内存(DRAM),程序中的变量都有相应的内存地址,对于传值调用举个例子

如 :void change(int a){

                a =0;

           }

           void main(){

                  int b = 1;

                  change(b);

                   printf("%d",b);

             }

输出的结果是 1,也就是说 change 函数没有将 b 的值改成0,为什么那?书上说的是change 参数中的b 是变量b的一个拷贝,所以不会改变。说的很明白,但是你可能还不懂,你可以在change()中,a=0的后面输出一下a,你回发现输出的是0,而main()函数中输出的是1。

上述操作后可以得出一个结果,就是传到change()中的参数和我们main()函数里面print的参数不是同一个变量。查看C语言的函数章节后发现函数执行的时候,参数会放在一个运行时堆栈中,而main()中的 int b,则把b放在静态存储区,而且函数执行后,会将将参数释放掉,所以print 中的b对应的是静态存储区中的b,其值为1.


函数的参数是指针,我们说传进来的是地址,内存中的地址也是唯一的,所以对指针指向的变量的操作就是对内存中该地址处存放的变量的直接操作。会修改其值。例如

void change(int *a)

{

*a =0;

}

void main(){

int *m;

int b=10;

m=&b;

printf("%d\n",*m);

change(m);

printf("%d\n",*m);

}

输出的结果为 10

                          0







                                                                        微笑明天又是新的一天

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值