惧留孙网

juliusun.com

在线教程 > C语言教程 > 参数值传递

参数值传递

第 31/50 节 冥河C语言教程


C语言调用函数时参数传递方式是值传递。值传递说的好理解一点,就是在传递参数时,系统会把参数复制一份复本,然后把复本传递给函数作为参数。因此,无论函数对参数如何操作,操作的都是参数的复本,不会影响参数本身。

为了方便讲解,先理解两个名词,调用者和被调用者。

调用者,也可称为主动调用函数或调用函数,即调用其它函数并且传递给其它函数参数的函数。参数列表为空也算传递了参数,传递的参数是空。

被调用者,也可称为被调用函数。即被其它函数调用的函数。

如:我们在main函数里调用了scanf函数,此时,称main此时为调用者,scanf为被调用者。由于函数即可以调用其它函数,也可被其它函数调用,因此调用者或是被调用者只是针对在某次调用操作发生时进行的称呼。scanf函数内部可能还调用了其它函数,当调用其它函数时,此时scanf又是调用者了。调用者或被调用者是相对而言。

再认识一个内存中的区域。内存中系统会保留一段区域存放参数,这段区域叫栈,参数就是放在栈里的。栈里也存放局部变量,不过与本节内容无关,大家只要知道参数是放在栈里的就可以了。


函数调用及参数传递过程如下:调用者首先计算参数的值,参数可以是常量、变量或是表达式等。计算参数的值完毕,把这些值统统复制出复本,再把复本放进栈里,然后开始调用被调用者,等着被调用返回才会继续执行。被调用者开始执行,首先从栈里取出参数的复本,然后对复本进行操作,代码执行完或遇到return语句时,将返回值交给CPU,退出执行。调用者发现被调用者执行完了,就从CPU中取出返回值,继续执行下面的代码。

上段讲述是被调用者把返回值交给CPU,这个只是为了讲解方便,不同的系统处理返回值不一样,不必深究,主要讨论参数传递。

如果要调用一个函数改变本函数中的一个局部变量,把这个变量作为参数传递给被调用者是错误,但是可以把变量地址传递给被调用者,调用者直接利用指针修改变量就可以了。

我们调用一个函数,将本函数内一个变量设置为0,变量作为参数,会发现无法达到我们想要的效果,例:


  1. #include<stdio.h>
  2. int main( )
  3. {
  4. void set_zero(int a); //调用前声明一下函数
  5. int i = 1;
  6. printf("修改前的变量值为 %d\n", i );
  7. set_zero(i); //变量i作为参数传递给set_zero,set_zero会得到变量i在栈里的复本
  8. printf("修改后的变量值为 %d\n",i );
  9. getchar( ) ; //使程序暂停一下
  10. return 0;
  11. }
  12. void set_zero(int a)
  13. {
  14. a = 0; //只是将栈里的变量参数复本修改为0,不会对实际传递进来的参数变量产生影响
  15. }

效果类似如下图:

Pic

很显然,没有达到目的。

把函数参数改成指针类型,同时把变量的地址传递给函数就可以了。


例:



  1. #include<stdio.h>
  2. int main( )
  3. {
  4. void set_zero(int * a); //调用前声明一下函数
  5. int i = 1;
  6. printf("修改前的变量值为 %d\n", i );
  7. set_zero(&i); //i地址传递给set_zero,地址复本还是指向i的地址,所以会修改成功
  8. printf("修改后的变量值为 %d\n",i );
  9. getchar( ) ; //使程序暂停一下
  10. return 0;
  11. }
  12. void set_zero(int * a)
  13. {
  14. *a = 0; //把指向的地址内容改成0
  15. }

修改成功,效果图类似如下:

Pic

作者:冥河 QQ:3304576112
交流QQ群:554701039 C语言讲课群
本教程内容由本站保留版权,请勿复制传播
抖音
©2015-2024 惧留孙网 juliusun.com

京ICP备15039193号-1

首页 教程 下载 文章 聊天 我的