传参的指针,你的值到底变了没?!(有关函数形参修改的另类案例)

我们都知道,想要在函数中修改某个变量的值,传变量本身是没有用的。原因在于不同的函数在不同的空间上,函数的生命周期随着函数的调用而结束,因此在函数内部进行的值操作是不会对函数外的变量产生影响的。所以在函数里面想要修改变量的值,必须使用指针。

可是当阴险的助教跟你玩阴的的时候,指针似乎也不好使了....来看看可爱的助教们是怎样坑害清澈愚蠢的大学生的吧~

给出下述程序的执行结果

#include <stdio.h>

void swap(int *p, int *q){

  int *t;

   t=p;

   p=q;

    q=t;

}

int main(){

int a=10,b=20;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

return 0;

}

乍眼一看,哼哼,小小的swap函数不就是交换两个变量的值吗,这有何难!

自信写下:a=20,b=10 

然后.... 

听取完一片WA声之后,得看看问题出在了那里。

 上面这个是还没有进行swap的地址

这个是已经交换过后的地址,你会发现没有变。

其实问题的本质是简单的,当你在函数中进行交换的时候,你只是在函数内部对函数的p和q变量进行了交换地址,而&a,&b本质上不是变量(即没有用一个新的变量名来对他们进行存储)而是一个值,所以无论怎样交换,只要你从函数中出来,a和b这两个变量还在,当你写&a,&b的时候,可以理解为又一次的对a和b进行取地址操作,他们俩的地址就不会改变,输出的值也不会改变。

那么假设我们使用两个变量来存储地址呢?

还是没有变(a仍然等于10)!这说明前面的理解是肤浅的,哪怕我们使用了两个变量来存储地址,还是会出现问题。

经过了解之后,上面问题的原理,本质上就是一个:函数传的形参无论它是什么类型,在函数中进行的操作,在主函数或者其他函数中都是无效的(即相应的修改不会对主函数中的这个变量产生影响)。之前我们说想要在函数中修改一个变量的值要传指针,其实是一条普适性的原理。大家可以想一想,指针其实本质上也是一种变量,那么想要修改指针的话就要传入指针的指针——二级指针! 因此本例中在函数中的交换指针的值其实是无效的,a的地址还是a的地址。所有问题就迎刃而解了。

总结来说就是我上面说的那句话:想要在函数中修改一个变量(普通变量,包括指针,二级指针!)的值要传指针!所有函数传参修改值的问题就秉持这个原则就行了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值