在C中通过引用传递过程中会发生什么?

时间:2012-10-18 11:24:01

标签: c string pointers pass-by-reference

我知道当我们将一个参数传递给函数时,会在函数的堆栈中创建一个副本,并且调用者函数中参数的实际值没有变化。

将指针传递给函数时会发生什么?我知道参数的值在调用者函数中被更改了。但它是如何在内部发生的?被调用函数如何访问调用者函数中的变量?

我试图从Call_by_reference page in wikipeidia获取信息,但并不重要。

一旦我开始阅读有关字符串并将字符串作为参数传递给其他函数,我对此感到困惑。任何有关这方面的帮助都会有很大帮助。感谢!!!!

5 个答案:

答案 0 :(得分:9)

当您将指针传递给函数时,指针会被复制。但是,指向对象x的指针的副本也是指向x的指针,因此可用于修改x

对于(人为的)类比,假设x是你的家。根据C的规则,当你需要一个水管工来修理你房子里的东西时,你可以把你的房子的副本传给水管工,让他们解决这个问题,并将副本交给你。毋庸置疑,对于大于几个字节的房屋,由于所有复制,效率非常低。所以相反,你给管道工一个指向你房子(它的地址)的指针,这样管道工就可以进入你的房子并在现场修理它。这就是所引用的调用:你不传递你想要修改的数据,而是传递指向该数据的指针,以便被调用者知道在哪个位置进行操作而不仅仅是

const int broken = 0, fixed = 1;

struct House {
    int plumbing;
};

void plumber(House *h)
{
    h->plumbing = fixed;
}

int main()
{
    struct House h;
    h.plumbing = broken;
    plumber(&h);          // give the plumber the address of the house,
                          // not a copy of the house
    assert(h.plumbing == fixed);
}

在传递字符串的情况下,传递的是指向字符串中第一个char的指针。使用指针运算,您可以获得以下元素。

答案 1 :(得分:4)

C没有通过引用传递。将指针传递给函数时,实际上是将变量的地址传递给函数。然后,该函数可以更改该地址的值,然后此更改将反映在调用函数中的变量中。但是,如果您尝试更改指针指向的地址,则更改将不会反映在调用函数中,因为指针仍按值传递。

void f(int *j) {
  (*j)++;
  int k = 20;
  j = &k;
}

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

  return 0;
}

<强>输出

i = 20, p = 0x123456
i = 21, p = 0x123456

答案 2 :(得分:4)

C中的每个参数都按值传递。

答案 3 :(得分:3)

所有数据都存储在具有特定地址的特定位置。通过引用传递时,可以通过引用传递数据的地址。并告诉函数使用间接寻址来操纵数据。

当您将其传递给函数时,(变量的)地址作为数据发送,但数据本身是按值传递的。

答案 4 :(得分:3)

                        a=10     b=20
                        ------   -------
                        0xf8      0Xf4
                    ----------  ---------

                Suppose a and b are two variables in a function stack
                when you call another function 
                foo(&a,&b)
                actually 0xf8 and 0xf4 is caught in the definition of 
                foo(int *pa,int *pb)

       So  pa=0xf8    pb=0xf4
           --------    ---------
 But *pa = 10 and *pb = 20 , You can manipulate like this.
 So these pointers start pointing to the actual data and any changes here are reflected in the original environment.