C语言函数篇(二)函数参数基础设计
形参实现一种数据传入的接口 ,由 实参 拷贝给 形参.
拷贝!!!!!!!!!!!
例1:
void func(int tmp){ //意图是实现传进来的参数 +1
tmp++;
}
int mian(){
int a = 10;
func(a);
printf("%d\n",a); //输出结果还是 10, 并没有实现我们需要的功能
}
解析:参数传递是拷贝的概念.
由于函数设计的时候, 形参是 int tmp, 执行的动作是将 a 的值 拷贝成 tmp, 传递后
tmp = 10, --> tmp++; --> tmp = 11
因为tmp 是由 a 拷贝出来的,是副本,改动副本并不会影响 a 数据本身,所以 a 的值并不会发生改变.
需求:我们确确实实想通过参数传递,来改变实参的内容.
例2:
void func2(int *tmp){
(*tmp)++;
}
int main(){
a = 10;
func2(&a);
printf("%d\n",a); //a = 11;
}
解析:同样是拷贝,为什么func2 的设计让实参发生了改变?
因为 func2 拷贝的是 a 的地址, 把 a 的地址拷贝给 tmp ,这时候 *tmp 指向的也是 int a 这个空间
在操作 *tmp 的时候,就是直接对这个空间内的数据进行改变,所以让 a 的值发生了改变
func1 是 值传递
func2 是 地址传递
值传递 和 地址传递 本身不具备 某种特定的标签 在参数传递的过程 只有拷贝两个字 .
而拷贝什么东西 ,其实是由我们人为设计的.
拷贝 数值本身 ,就是创建数值副本,不会影响到原始数值,称作 值传递
拷贝 空间地址, 就是将 指针A 拷贝成 指针B, 指针B指向的空间是和指针A指向的空间是一样的,因为指针B是指针A的副本, 既然指针B能够操作这个空间,那自然能够改变这个空间里面的内容.
总结:
值传递: int func1(int tmp){} 在保护原始数据的时候用值传递 缺点:拷贝空间本身,而非地址,创建副本耗费资源,不灵活
地址传递: int func2(int *tmp){} 好处:传递参数灵活, 拷贝的是指针,拷贝内容少,指针只有 int大小 .
空间传递: C语言函数篇(三)函数参数高级设计