在C中通过引用传递
如果C不支持通过引用传递变量,为什么这会起作用?
#include <stdio.h>
void f(int *j) {
(*j)++;
}
int main() {
int i = 20;
int *p = &i;
f(p);
printf("i = %dn", i);
return 0;
}
产量
$ gcc -std=c99 test.c $ a.exe i = 21
因为您将指针的值传递给方法,然后将其解引用以获取指向的整数。
这不是传递参考,就像其他人所说的那样,传递价值。
C语言是毫无例外地传递值。 将指针作为参数传递并不意味着传递参考。
规则如下:
功能无法更改实际参数值。
让我们试着看看函数的标量和指针参数之间的差异。
标量变量
这个简短的程序使用标量变量显示传值。 param
称为形式参数,函数调用时的variable
称为实际参数。 注意函数中递增param
不会改变variable
。
#include <stdio.h>
void function(int param) {
printf("I've received value %dn", param);
param++;
}
int main(void) {
int variable = 111;
function(variable);
printf("variable %dm", variable);
return 0;
}
结果是
I've received value 111
variable=111
通过引用的错觉
我们稍微更改一段代码。 param
现在是一个指针。
#include <stdio.h>
void function2(int *param) {
printf("I've received value %dn", *param);
(*param)++;
}
int main(void) {
int variable = 111;
function2(&variable);
printf("variable %dn", variable);
return 0;
}
结果是
I've received value 111
variable=112
这让你相信这个参数是通过引用传递的。 不是。 它是按值传递的,参数值是一个地址。 int类型的值增加了,这是使我们认为它是通过引用函数调用的副作用。
指针 - 传递值
我们如何证明/证明这一事实? 那么,也许我们可以尝试标量变量的第一个例子,但是我们使用地址(指针)而不是标量。 让我们看看这是否有帮助。
#include <stdio.h>
void function2(int *param) {
printf("param's address %dn", param);
param = NULL;
}
int main(void) {
int variable = 111;
int *ptr = &variable;
function2(ptr);
printf("ptr's address %dn", ptr);
return 0;
}
结果将是两个地址相同(不要担心确切的值)。
示例结果:
param's address -1846583468
ptr's address -1846583468
在我看来,这清楚地证明了指针是按值传递的。 否则函数调用后ptr
将为NULL
。
在C中,传递引用是通过传递一个变量(一个指针)的地址并在函数中取消引用该地址来读取或写入实际变量来模拟的。 这将被称为“C型传递参考”。
资料来源:www-cs-students.stanford.edu
链接地址: http://www.djcxy.com/p/20705.html