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

当前回答

你所做的是传递值,而不是传递引用。 因为你正在将变量'p'的值发送给函数'f'(在main中为f(p);)

在C语言中,同样的程序通过引用传递看起来像,(!!这个程序给出了2个错误,因为C不支持引用传递)

#include <stdio.h>

void f(int &j) {    //j is reference variable to i same as int &j = i
  j++;
}

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

  return 0;
}

输出:

3:12: error: expected ';', ',' or ')' before '&' token
             void f(int &j);
                        ^
9:3:  warning: implicit declaration of function 'f'
               f(a);
               ^

其他回答

代码片段(有微小修改)

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

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

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

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

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

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

指针和引用是两个不同的东西。

有几件事我没有看到有人提到。

指针是某物的地址。指针可以像其他变量一样存储和复制。因此,它有一个大小。

引用应该被视为某个东西的别名。它没有大小,不能存储。它一定是指什么。不能为空或更改。好吧,有时候编译器需要将引用存储为指针,但这是实现细节。

有了引用,你就不会有指针的问题,比如所有权处理、空检查、使用时取消引用。

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

P是一个指针变量。它的值是i的地址。当你调用f时,你传递p的值,它是i的地址。