那不是引用传递,而是其他人所说的值传递。
C语言毫无例外地传递值。将指针作为参数传递并不意味着传递引用。
规则如下:
函数无法更改实际参数值。
让我们尝试看看函数的标量和指针参数之间的差异。
标量变量
这个简短的程序显示了使用标量变量的值传递。param
被称为形式参数,variable
在函数调用时称为实际参数。注意param
,该功能的增加不会改变variable
。
#include <stdio.h>
void function(int param) {
printf("I've received value %d\n", param);
param++;
}
int main(void) {
int variable = 111;
function(variable);
printf("variable %d\m", variable);
return 0;
}
结果是
I've received value 111
variable=111
通过引用的错觉
我们稍微修改一下代码。param
现在是一个指针。
#include <stdio.h>
void function2(int *param) {
printf("I've received value %d\n", *param);
(*param)++;
}
int main(void) {
int variable = 111;
function2(&variable);
printf("variable %d\n", variable);
return 0;
}
结果是
I've received value 111
variable=112
这使您相信该参数是通过引用传递的。它不是。它通过值传递,参数值是一个地址。int类型的值增加了,这就是使我们认为这是一个传递引用函数调用的副作用。
指针-按值传递
我们如何证明/证明这一事实?好吧,也许我们可以尝试第一个标量变量示例,但是我们使用地址(指针)代替标量。让我们看看是否有帮助。
#include <stdio.h>
void function2(int *param) {
printf("param's address %d\n", param);
param = NULL;
}
int main(void) {
int variable = 111;
int *ptr = &variable;
function2(ptr);
printf("ptr's address %d\n", ptr);
return 0;
}
结果将是两个地址相等(不必担心确切的值)。
结果示例:
param's address -1846583468
ptr's address -1846583468
在我看来,这清楚地证明了指针是按值传递的。否则ptr
将NULL
在函数调用之后。