C函数的参数传递,在以前的学习中,知道函数参数传递分为值传递与地址传递。对这两种的参数的传递,一直都不是那么很清楚的理解,一直到昨天老师给我看了一个面试题,才真正的明白C函数的参数传递。
void GetMemory(char *p)
{
p = (char*)malloc(100*sizeof(char));
}
int main()
{
char *str;
str = NULL;
GetMemory(str);
......
......
return 0;
}
上面这道题,是通过函数GetMemory()给主函数的char类型的指针变量str分配到内存,但实际上调用完GetMemory()函数之后,str并没有获得到内存,str的值还是NULL。这是为什么呢?
下面是我对C函数参数传递的的理解:
C函数的参数传递的本质都是值传递。在通过变量作为实参传递给函数,在执行函数体时,都会对变量的值拷贝给形参变量,所以在函数体内,对形参变量进行操作时,实际上只改变形参变量的值,所以在函数体外部里形参变量的值并没有发生改变。
其实指针传递的实质也是进行值传递,指针的本质也是变量,只是其内容是地址,在进行指针传递时,函数体内,对传递进来的指针进行拷贝,这时在函数体里也存在一个拷贝的指针变量,但这个拷贝的指针变量的内容与传递进来的指针变量的内容是一致的,也就是这个拷贝的指针变量与传递进来的指针变量指向同一内存,所以在函数体内通过操作这个拷贝的指针变量指向的内存,也就会影响到函数体外部去。
现在来分析上面那题:
主函数里申请 char类型的指针变量str,并把str初始化为NULL, 再调用GetMemory(),我们进入函数体内部,首先对str进行一份拷贝,让char类型的指针变量p的内容等于str的内容,实际上就是让他们指向同一内存,注意这里p与str是两个指针变量了,只是p是str里的内容是一样的,这里里面的内容是NULL,再对p进行赋值(p = (char*)malloc(100*sizeof(char));),因为是p和str两个变量,对p进行赋值并不影响str的值,所以也就是为什么主函数里str并没有分配到内存的原因。
以上是我个人的理解,若有什么地方不对,欢迎指出!