今天我在学习C语言中的函数时,遇到了一个非常有意思的问题:我们都知道在Java、JS、Python等语言中函数的定义时常会用到参数,我一直以来都认为函数的参数都是形参~~~~(看来还是我见识少了)
今天我在学习中,看到了这样的一个案例:(各位看官老爷请看)
#include <stdio.h>
void printAddress(int data){
printf("形参daat的地址:%p\n",&data);
}
int main(){
int data=10;
printf("主函数中 实参 data的地址:%p\n",&data);
printAddress(data);
return 0;
}
在这里运行之后给到的答案是:
很显然,主函数中的全局变量data的地址和函数中形参的地址是完全不一样的(这里还涉及到了生命周期巴拉巴拉)。
在这里大多数初学者都会陷入一个误区,也是新学者的一个必踩坑,理所当然的认为在函数中所有的参数都是用完就扔(死渣男),要你了就建立一个临时地址(就是钟点房),用完了就destroy。
好好好!今天我有尝试了数组,属实是惊到我了:我一直以为,我天真的以为在函数中,是否定义数组的大小就会决定它是否会发生地址的改变。
//我天真的以为在函数中,是否定义数组的大小就会决定它是否会发生地址的改变
//我以为没有大小的,就是有点像指针,直接自报家门
void printAddress1(int arr[]){
printf("printAddress1(int arr[])打印arr数组的地址:\n");
printf("arr[0]=%d,address=%p\n",arr[0],&arr[0]);
printf("arr[1]=%d,address=%p\n",arr[1],&arr[1]);
printf("arr[2]=%d,address=%p\n",arr[2],&arr[2]);
printf("=================================\n");
}
//我还天真的以为有规定数组大小的,就是彪子立牌坊,又装又立
void printAddress2(int arr[3]){
printf("printAddress2(int arr[3])打印arr数组的地址:\n");
printf("arr[0]=%d,address=%p\n",arr[0],&arr[0]);
printf("arr[1]=%d,address=%p\n",arr[1],&arr[1]);
printf("arr[2]=%d,address=%p\n",arr[2],&arr[2]);
printf("=================================\n");
}
int main(){
int arr[]={1,2,3};
printf("打印arr数组的地址:\n");
printf("arr[0]=%d,address=%p\n",arr[0],&arr[0]);
printf("arr[1]=%d,address=%p\n",arr[1],&arr[1]);
printf("arr[2]=%d,address=%p\n",arr[2],&arr[2]);
printf("=================================\n");
printAddress1(arr);
printAddress2(arr);
return 0;
}
但是,咱们计算机死板的很,只有1和0,实践告诉了我正确答案:
实践是检验理论的唯一标准,事实胜于雄辩,很明显在C语言中,在函数中的数组参数,无论你是否规定它的大小,他都是以地址的形式去冲他老家的。在这里就没有临时创建空间的说法啦,直接就是推水晶。
所以说,在函数中,对于数组内数据的改变,都是很现实的,直接“中出”,会直接改变里面的内容!
以上是我的浅薄理解,请各位看官老爷斧正!!!