在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

上一篇: Passing by reference in C

下一篇: value, reference variables