指针变量作为函数参数 -值传递和地址传递区分
参考谭浩强版本C语言,本书对于函数的参数传递方式一共就介绍了两种:值传递和地址传递
P224页:
从此页开始介绍指针变量作为函数的参数的情况,在这之前,本书的参数传递方式是值传递,也就是参数不涉及到所谓的指针类型,一般函数参数都是变量:
void add(int a,int b);//参数a b都是int类型的变量,不是指针类型,判断为值传递;
何为值传递? 先给大家分析一下值传递:
请大家看一下代码:
1. void swap1(int x,int y)
2. {
3. int temp;
4. temp = x;
5. x = y;
6. y = temp;
7. printf("x = %d,y = %d\n",x,y);
8. }
9. int main()
10. {
11. int a = 12,b = 24;
12. swap1(a,b); // 值传递
13. printf("a = %d b = %d",a,b);
14. }
结果如图所示:
分析:
首选我们都知道main实际上也是一个函数,它的作用范围是 第10行-第14行
swap1也是一个函数,它的作用范围是1-8行
main函数中的变量与swap函数区域中的变量互不冲突的:
程序未执行前:
当程序执行到第12行时候:
main函数中的变量a把12这个int型数据赋值给swa1中的变量x(变量b对y也是同理),之后后续的在swap1函数中的操作,全是针对swap1函数中的变量x和变量y进行的,与Main函数中的变量a和p没有关系了! ,a和b仅仅起到了赋值的作用!! ! !
所以swap1中的x和y的交换,实际上是swap1函数中的x和y交换,与main函数中的变量a和b没有关系,而且我们是在main函数中的是 printf(“a = %d b = %d”,a,b); ,当然要输出的是main函数中的变量a和b,
何为地址传递?
在前面一和二章节的基础之上,我们分析下面的例子:
1.void swap2(int* x,int* y)
2.{
3. int temp;
4. temp = *x;
5. *x = *y;
6. *y = temp;
7. printf("x = %d y = %d\n",*x,*y);
8.}
9.int main(int argc, char *argv[])
10.{
11. int a = 12,b = 24;
12. swap2(&a,&b); //地址传递
13. printf("a = %d b = %d",a,b);
14.}
**
1.程序未执行前的状态:
这一次我们标注好了Main函数中变量a和变量b的地址,(下面那个打错了,应该是swap2的函数作用区域)
.
2. 当程序执行到第12行时候:由于&a和&b代表的是地址,即参数是地址,程序执行的是地址传递的方式,地址传递不同于值传递,此刻的变量a和变量b会把自己的地址传递给变量x和变量y:
3.那么后续中对swap2函数中的操作:
1.void swap2(int* x,int* y)
2.{
3. int temp;
4. temp = *x;// *是代表把指针变量x所存储地址(x当中存储的是2000 也就是main函数中变量a的地址) 的对应内容(地址2000(即变量a的地址)对应的内容是12)交给temp;
5. *x = *y;// 把指针变量y存储的地址 对应的内容 交给 指针变量x存储的地址 对应的空间
6. *y = temp;//同上理
7. printf("x = %d y = %d\n",*x,*y);
8.}
这样实际上在swap2函数中对地址的操作,实际上是在对main函数中的变量内容进行操作,所以最后的结果为:
更多C语言的注意事项,请大家关注这个文章~,我会不断更新:
C语言程序设计(谭浩强版本)-考研版注意事项-适合考研和C语言入门小白食用
有喜欢算法的小伙伴可以一起关注算法~:
感谢大家的支持~