如果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 

当前回答

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

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

其他回答

代码片段(有微小修改)

void add_number(int * const a) {
    *a = *a + 2;
}

在c++中也存在,在语义上等价于

void add_number(int &a) {
    a = a + 2;
}

在这两种情况下,编译器都希望生成相同的add_number函数二进制代码。现在,当您将一个整数视为一个值时,该值将由它的引用传递,在上面的模式中,引用在技术上显示为指针。

结论 C支持通过引用传递实例的语义。 即使在技术上使用int *a你也传递了*a,它是一个引用。

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

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

在C语言中,为了通过引用传递,你使用了地址操作符&,它应该用于一个变量,但在你的例子中,因为你已经使用了指针变量p,你不需要在它前面加上地址操作符。如果你使用&i作为参数:f(&i),这将是正确的。

你也可以添加这个,来解引用p,看看这个值如何匹配i:

printf("p=%d \n",*p);

你不是通过引用传递int型,而是通过值传递指向int型的指针。不同的语法,相同的意思。