【问题标题】:what happens during pass by reference in C?在 C 中通过引用传递时会发生什么?
【发布时间】:2012-10-08 20:13:57
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c string pointers pass-by-reference


    【解决方案1】:

    当您将指针传递给函数时,指针会被复制。但是,指向对象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 的指针。通过指针算法,您可以得到以下元素。

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:
                                    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.
            

            【讨论】:

              猜你喜欢
              • 2017-06-20
              • 1970-01-01
              • 2012-03-18
              • 2010-09-24
              • 2011-09-30
              • 1970-01-01
              • 1970-01-01
              • 2016-03-31
              • 1970-01-01
              相关资源
              最近更新 更多