如果C语言不支持通过引用传递变量,为什么这样做呢?

#include <stdio.h>

void f(int *j) {
  (*j)++;
}

int main() {
  int i = 20;
  int *p = &i;
  f(p);
  printf("i = %d\n", i);

  return 0;
}

输出:

$ gcc -std=c99 test.c
$ a.exe
i = 21 

当前回答

C中没有引用传递,但是p“指向”i,你通过值传递p。

其他回答

因为你传递了一个指向变量p的指针(内存地址)到函数f中。换句话说,你传递的是一个指针而不是一个引用。

因为你把指针的值传递给了方法然后对它进行解引用以得到所指向的整数。

“通过引用传递”(通过使用指针)从一开始就存在于C语言中。你为什么不这么认为?

您正在按值传递一个指针(地址位置)。

这就像是在说“这里有我想让你更新的数据”。

这不是引用传递,而是其他人所说的值传递。

C语言毫无例外地采用值传递。传递指针 作为参数并不意味着引用传递。

规则如下:

函数不能改变实际的参数值。

(以上引自《K&R》一书)


让我们试着看看函数的标量形参和指针形参之间的区别。

标量变量

这个简短的程序展示了使用标量变量的值传递。参数被称为形式参数,函数调用时的变量被称为实际参数。注意在函数中增加参数并不会改变变量。

#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("address param is pointing to %d\n", param);
    param = NULL;
}

int main(void) {
    int variable = 111;
    int *ptr = &variable;

    function2(ptr);
    printf("address ptr is pointing to %d\n", ptr);
    return 0;
}

结果将是两个地址相等(不要担心确切的值)。

结果示例:

address param is pointing to -1846583468
address ptr   is pointing to -1846583468

在我看来,这清楚地证明了指针是按值传递的。否则,函数调用后ptr将为NULL。