2.7.4使用指针变量作为函数参数
指针类型也可以作为函数参数的类型,这个时候视为把变量的地址传入函数,如果在函数当中对这个地址当中的元素进行改变,原先的数据结汇确实的被改变
#includevoid change(int *p){ *p=233; } int main(){ int a=1; int *p=&a; change(p); printf("%d\n",a); return 0; }
输出的结果:233在上述代码当中,把int 型的指针变量p赋值给a的地址,然后通过change函数把指针变量p作为参数传入,此时传入的其实是a的地址。在change函数当中,使用p修改地址当中村昂的数据,也就是改变了a的本身,当最后输出的a的时候,就是已经改变了其值,这种传递方式称为值传递。一个经典的例子:使用指针作为参数,交换两个数
#include int main(){ int a=1,b=2; int temp=a; a=b; b=temp; printf("a=%d,b=%d\n",a,b); return 0; }
把交换功能写成函数:
#includevoid swap(int a,int b){ int temp=a; a=b; b=temp;} int main(){ int a=1,b=2; swap(a,b); printf("a=%d,b=%d\n",a,b); return 0; }
输出结果:
a=1,b=2;
这是因为函数在接受参数的过程当中是单向一次性的值传递,也就是说,在调用swap(a,b)的时候只是把a和b的值穿进去了,这样相当于产生了一个副本,对于这个副本的操作不会影响main函数当中的a,b的值,
指针变量存放的是地址,那么使用指针变量作为参数的时候,传进来的也是地址,只有在获取地址的情况下,对元素进行操作,才能够真正的修改变量。为此,把下面代码改写成下面这样:
#includevoid swap(int *a,int *b){ int temp=*a; *a=*b; *b=temp;} int main(){ int a=1,b=2; int *p1=&a,*p2=&b; swap(p1,p2); printf("a=%d,b=%d\n",*p1,*p2); return 0; }
这时的,swap函数当中a和b都是地址,而*a,*b就是地址当中存放的数据,可以看成是int型变量
初学者会把temp变成指针变量,认为这样完全就可以像普通变量一样进行交换操作,这个想法其实没有问题,出问题的地方就在temp,在定义int *类型的指针变量temp的时候,temp没有被初始化,也就是说,指针变量temp当中存放的地址是随机的。如果该随机地址指向的是系统工作空间,那么就会出错(而且这样的概率特别大)
main函数传给swap函数的地址是一个无符号的整形数,其本身也跟普通变量一样只是值传递,swap函数对地址本身进行修改,并不能够对main函数里的地址进行修改,对于地址本身进行修改其实跟之前对传入的普通变量进行交换的函数是一样的作用,都只是副本,没有对数据产生实质性的影响,即相当于baint *看做是一个整体,传入的a和b都只是地址的副本。
欢迎打赏,么么哒!
●R语言
●句子
●JAVA
●C语言以及算法笔记
●大学生生活图鉴
●JavaScript
●计算机网络原理
●计算机组成原理
●操作系统
●数据库系统概论
●数据结构
●英语
●Linux
●数字图像处理
●云计算与人工智能
●资源
●明星电视剧社会现象娱乐
Python
仙女都在看点点点,赞和在看都在这儿!