函数调用中实参和形参变化问题
来源:互联网 发布:看不见的客人知乎 编辑:程序博客网 时间:2024/05/22 07:53
http://blog.chinaunix.net/uid-27645052-id-3337748.html
很多初学者搞不明白子函数中什么时候可以改变实参值,什么时候不会改变。今天来具体分析下。
先来解释下实参和形参,所谓实参,就是通过主函数传递给子函数的变量。而子函数中用来接收变量的参数就称形参。如下:
点击(此处)折叠或打开
- #include<stdio.h>
- void fun(int p,int q)
- {
- int temp;
- temp = p;
- p = q;
- q = temp;
- return ;
- }
- int main()
- {
- int x = 1,y = 2;
- fun(x,y);
- printf("%d\t%d\n",x,y);
- return 0;
- }
以上代码中,x,y是main函数要传递给子函数fun的实参,而p,q就是用来接收x和y的值的形参,所以,形参和实参的类型必须相同。 函数在传参过程中,是一个内容的拷贝过程,而每个函数都会有自己的栈空间来存放局部变量,所以,形参和实参是不同的内存单元。通俗点讲,就是,你改变他们其中一个的值,另一个的值不会改变。
如上程序,main函数将x和y传给了fun函数的p和q,相当于p和q是对x和y的拷贝,p和q是存放于fun函数的栈空间的,x和y是存放于main函数的栈空间,它们是不同的内存单元,所以在fun函数中交换p和q的值并不影响x和y的值,x和y的值仍然分别为1和2。而且,随着fun函数的结束,p和q这两个局部变量会被释放。
但是,当你传递的参数是个指针的时候,就可以改变实参的值,以下通过程序来详细分析。
点击(此处)折叠或打开
- #include<stdio.h>
- void fun(int *p,int *q)
- {
- int temp;
- temp = *p;
- *p = *q;
- *q = temp;
- return ;
- }
- int main()
- {
- int x = 1,y = 2;
- fun(&x,&y);
- printf("%d\t%d\n",x,y);
- return 0;
- }
这段程序的输出结果为2 1。这是为什么呢?
main函数在给fun函数传递参数时,传递的是x和y的地址,而fun函数用p和q接收了这两个地址,也就是,p中存放的是x的地址,q中存放的是y的地址,即*p和*q就分别是x和y了,然后再将*p和*q进行交换,也就是将x和y进行了交换,所以最终x的值为2,y的值为1。
但是如下程序传了指针,却没有改变x和y的值:
点击(此处)折叠或打开
- #include<stdio.h>
- void fun(int *p,int *q)
- {
- int *temp;
- temp = p;
- p = q;
- q = temp;
- return ;
- }
- int main()
- {
- int x = 1,y = 2;
- fun(&x,&y);
- printf("%d\t%d\n",x,y);
- return 0;
- }
这段程序输出结果为1 2。为什么呢?
虽然main函数将x和y的地址传给了fun函数,但是fun函数交换的是p和q的值,也就是,只对两个地址进行了交换,此时p中存放y的地址,q中存放x的地址,但是,这并没有影响x和y的值,所以x仍为1,y仍为2。
由上面3个程序,我们可以知道,对子函数形参的改变,并不影响main函数实参的值;但是,当main函数实参传递的是变量的地址,子函数形参作为指针p的时候,对*p进行操作,会改变main函数中变量的值;但是如果单纯对指针p进行操作,也一样不会影响main函数中实参的值。
- 函数调用中实参和形参变化问题
- 函数调用中实参和形参变化问题
- 函数调用,形参实参的变化
- 关于函数调用过程中的实参和形参问题
- 函数形参和实参问题
- 关于,函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致 问题分析
- 关于C和C++中函数调用时的形参和实参
- 调用函数,有关形参和实参的易错问题。
- C语言中函数调用、实参、形参的选择
- C语言中实参和形参问题&&函数使用数组作为参数的问题
- 函数分类、函数声明和定义、函数调用,形参实参、函数嵌套调用
- 《IOS_C语言》函数分类、函数声明和定义、函数调用、形参实参、函数嵌套调用
- 函数 形参和实参
- 形参和实参调用方法
- 作业《IOS_C语言》函数分类、函数声明和定义、函数调用、形参实参、函数嵌套调用
- C++中虚函数和默认实参问题
- 函数调用参数为指针时,实参跟形参的问题
- 关于C语言中一,二级指针函数中的使用和c语言中和函数发生调用时,实参和形参都会占用内存吗?
- 10 个古老的经久不衰的开源项目
- jquery iframe操作
- Migration from SQL server 2005/2008 to 2012
- 总结JDBC连接SQLServer的错误Error establishing socket
- 3D相关网站
- 函数调用中实参和形参变化问题
- 一起来学POSIX thread 之 基本概念
- trie树的模板
- 过QQ游戏大厅SX非法
- 2013寒假练习 1017:To the Max
- spring security3教程系列--自定义过滤链
- poj 1703 -- Find them, Catch them(并查集)
- SVNX *.o *.lo *.a *.la *.al .libs *.so *.so 等有些文件无法提交解决方法
- uva11490