在swap2中x和y真的被改变了(但是x和y真身还是没有进入swap2函数内,而是swap2函数内部跑出来把外面的x和y真身改了)。实际上实参x和y永远无法真身进入子函数内部(进去的只能是一份拷贝),但是在swap2我们把x和y的地址传进去给子函数了,于是乎在子函数内可以通过指针解引用方式从函数内部访问到外部的x和y真身,从而改变x和y。
6、小结:
通过上面的学习,我们可以看出,如果要在一个子函数里面来改变传进来的实参赋给形参的值(也就是主函数里面的变量值),采用指针的方式就能解决这个问题,这也是我们在看许多源代码都会看到这样的写法,你要明白这样的写法的好处(效率高)。
二、输入型参数和输出型参数:
1、函数为什么需要形参与返回值:
(1)函数名是一个符号,表示整个函数代码段的首地址,实质是一个指针常量,所以在程序中使用到函数名时都是当地址用的,用来调用这个函数的。示例如下,函数名它表示一个地址:
(2)函数体是函数的关键,由一对{}括起来,包含很多句代码,函数体就是函数实际做的工作。
(3)形参列表和返回值。形参是函数的输入部分,返回值是函数的输出部分。对函数最好的理解就是把函数看成是一个加工机器(程序其实就是数据加工器),形参列表就是这个机器的原材料输入端;而返回值就是机器的成品输出端。示例如下:
1 #include2 int multip5(int a) 3 { 4 return a*5; 5 } 6 int main(void) 7 { 8 // 程序要完成功能是:对一个数乘以5 9// 第一种方法:函数传参 10 int a = 3; 11 int b; 12 b = multip5(a); 13 printf("result = %d.\n", b); 14 15 return 0; 16 17}
输出结果:
1 result = 15.
(4)其实如果没有形参列表和返回值,函数也能对数据进行加工,用全局变量即可。用全局变量来传参和用函数参数列表返回值来传参各有特点,在实践中都有使用。总的来说,函数参数传参用的比较多,因为这样可以实现模块化编程,而C语言中也是尽量减少使用全局变量。
示例:
1 #include2 int x,y; 3 void multip5_2(void