如果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语言中,模拟了引用传递 通过传递变量的地址 (一个指针)并对其进行解引用 地址内的函数读取或 写出实际的变量。这将 被称为“C风格” 引用传递”。

来源:www-cs-students.stanford.edu

其他回答

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

因为在上面的代码中没有引用传递。使用指针(如void func(int* p))是通过地址传递的。 这是c++中的引用传递(在C中不起作用):

void func(int& ref) {ref = 4;}

...
int a;
func(a);
// a is 4 now

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

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

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

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

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

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

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