写在前面:
刚开始学习函数的时候难免遇到参数传递的烦恼,实参和形参该如何区分,传值调用和传址调用的区别到底是什么?面试的时候又该如何表述呢?下面就让我们一起探索吧!
一.函数的参数
实际参数(实参):
真实传给函数的参数.实参可以是:常量,变量,表达式,函数等.
不管实参时何种类型的量,在进行函数调用时,它们必须有确定的值,以便把这些值传送给形参.
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元).形式参数当函数调用完成之后就自动销毁了,因此形式参数只在函数中有效.
二.传值调用和传址调用
首先在讲这两者之前,可以先看一下下面的两个函数以及最终的结果.
#include <stdio.h>
void swap1(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
void swap2(int* pa, int* pb) {
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main() {
int num1 = 2, num2 = 5;
swap1(num1, num2);
printf("swap1: num1 = %d num2 = %d\n", num1, num2);
swap2(&num1, &num2);
printf("swap2: num1 = %d num2 = %d\n", num1, num2);
return 0;
}
可以看到swap1函数没有完成两数交换的功能,而swap2却完成了,这里究竟是为什么呢?下面可以继续分析分析...
解析:
传值调用:形参是实参的一份拷贝,在调用swap1函数的时候会开辟空间拷贝数据,因此在swap1函数中对形参的值进行交换并不会影响到实参的值.
传址调用:同样形参是实参的一份拷贝,在调用swap2函数的时候也会开辟空间拷贝数据,但是这里的数据是地址,也就是指针.虽然说是不同的两块空间,但是存储的是同样的地址,地址指向的是同一块空间.因此形参所指向的值发送改变,也会影响到实参所指空间值的改变.
传值调用可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量.
再好的种子,不播种下去,也不会结出丰硕的果实.