博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转载)C中实参与形参的“值传递”只能“单向传送”(透彻的理解)
阅读量:5061 次
发布时间:2019-06-12

本文共 1959 字,大约阅读时间需要 6 分钟。

链接地址:

今天又彻底地把这部分知识回顾了一下,好好地理解了一番。还是记下来比较靠谱,加深印象,省的以后再忘。

主调函数(比如main函数)中,调用函数(比如numpp函数)时,如果swap的参数在函数中改变了,那么此参数必须是指针类型的。还是例子好说话。

目的:实现main中的一个整形变量加1。(当然实际情况,如果简单的功能,不会采取调用函数方式,仅作说明)

错误的例子:

 

void numpp(int x)      {          x++;      }      main()      {          int a=2;          numpp(a);          printf("a=%d\n",a);      }

 

上述代码运行结果为:a=2,并没有加1。

正确的写法为:

 

void numpp(int *x)      {          (*x)++;      }      main()      {          int a=2;          numpp(&a);          printf("a=%d\n",a);      }

 

这次的运行结果是正确的:a=3。

这是为什么呢?

错误的例子分析:main中,a=2,调用numpp函数时,实参a的值传如x,然后x+1,于是x=3,函数调用结束后,x被释放掉,而a的值依旧没有改变,还是2,形参x的值并不会再传给a,只能实参向形参单向传送。

正确的例子分析:main中,a=2,&a是a的地址,即指针,调用numpp函数时,a的指针传送给指针变量x,那么x就指向了变量a,(*x)++,也就是x指向的变量加1,也就是a+1,变成了3,函数调用结束后,x被释放掉,但a的变化被保留了下来,所以是加1后的值3。

总结1:“单向传送”的“值传递”方式,就是形参值的改变不能改变实参的值。不可能通过执行调用函数改变实参变量的值,但是可以改变实参指针变量所指向的变量的值。

经验:为了使函数中改变了的变量值能被主调函数所用,不能把要改变值的变量作为函数参数,而应该用指针变量作为函数参数。在函数执行过程中,使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来。

其实还有一个经典的例子,就是swap函数,交换两个变量的值。

两个经典的错误:

1、

 

void swap(int x,int y)      {          int t;          t=x;          x=y;          y=t;      }      main()      {          int a,b;          int *p1=&a,*p2=&b;          swap(p1,p2);          printf("a=%d,b=%d\n",a,b);      }

 

2

void swap(int *x,int *y)      {          int *tp;          tp=x;          x=y;          y=tp;      }      main()      {          int a,b;          int *p1=&a,*p2=&b;          swap(p1,p2);          printf("a=%d,b=%d\n",*p1,*p2);      }

例1中的错误同最上面的错误一样,必须用指针变量做参数才行。但例2中,就是用指针变量做的参数,但还是不对,下面分析一下:main中,p1指向a,p2指向b,调用函数swap时,p1的值传送给x,p2的值传送给y,也就是说x指向a,y指向b,在函数中,x和y作了交换,于是x指向b,y指向a。但是,形参x和y的值并不会回头再传给实参p1和p2,所以p1依旧指向a,p2依旧指向b。a和b的值也依旧没有改变。

总结2:其实本质跟总结1一样。“单向传送”的“值传递”方式,就是形参值的改变不能改变实参的值。不可能通过执行调用函数改变实参指针变量的值,但是可以改变实参指针变量所指向的变量的值。

最后总结:函数执行过程中,不能通过改变形参变量的值,也不能通过改变形参指针变量的值,来改变实参变量或实参指针变量,而是通过改变形参指针变量指向的变量值,来改变实参变量的值。

如果这句话看明白了,那就真正理解了。

还有一句话可以体会一下:函数的调用,只可以得到一个返回值(即函数值),而使用指针变量做参数,可以得到多个变化了的值。

 

 

 

 

转载于:https://www.cnblogs.com/Fy1999/p/9210656.html

你可能感兴趣的文章
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>
Mongodb 基本命令
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
软件目录结构规范
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
Eclipse 调试的时候Tomcat报错启动不了
查看>>
【安卓5】高级控件——拖动条SeekBar
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android入门之文件系统操作(二)文件操作相关指令
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
jdk从1.8降到jdk1.7失败
查看>>