最近遇到一个坑,让我对实参和形参有了更深的了解。
假如在main方法中有一个指针变量p,它指向的内存地址为20000。现在将它传递到一个函数中,在这个函数里让它指向内存地址为20048。当函数执行完返回到main函数时,p所指向的地址还是20000,而不是20048。
看下面的代码:
#include<stdio.h>
void A(int* p){//此处p为形参
int x = 3;
p = &x;
printf("在函数中p中的地址为%d\n\n",p);
}
int main(){
int e = 9;
int* p = &e; //此处p为实参
printf("main:p中的地址为: %d\n\n",p);
A(p);
printf("main:p中的地址为: %d\n\n",p);
return 0;
}
其中的原理实际上涉及到形参和实参这两个概念:
实参出现在主调函数中, 形参出现在函数定义中。
形参在整个函数体内都可以使用, 当改变形参的值的时候,并不会改变实参的值。
就像一个普通的变量,当将其传递到函数当中处理的时候,主函数中变量的值不会改变一样,指针变量说白了也是变量,同样遵循这个规则。
之所以掉进这个坑里,还是将指针变量与指针混淆的原因,在函数中直接改变指针变量中地址所指向的内容,会改变函数外面指针所指向变量的值。但是在函数中改变指针变量的值,不会改变函数外面指针变量的值。