什么是在C中传递的byValue和byReference参数?

这个问题在这里已经有了答案:

  • 传递引用与价值传递之间有什么区别? 18个答案

  • 除了数组和函数(见下文)之外,C总是通过`value'传递参数:每个参数值的一个副本被传递给函数; 该函数不能修改传递给它的实际参数:

    void foo(int j) {
      j = 0;  /*  modifies the copy of the argument received by the function  */
    }
    
    int main(void) {
      int k=10;
      foo(k);
      /*  k still equals 10  */
    }
    

    如果你想要一个函数来修改它的参数,你可以使用指针参数来获得所需的效果:

    void foo(int *j) {
      *j = 0;
    }
    
    int main(void) {
      int k=10;
      foo(&k);
      /*  k now equals 0  */
    }
    

    这有时被称为其他语言中的“通过引用传递”。


    在c语言中没有引用

    按值传递:意味着您正在创建变量的临时副本并发送给参数。

    通过引用传递(在c语言中没有这样的概念) :意味着您只是在调用时给原始变量另一个名称,并且没有创建临时副本。

    按价值调用:

    int foo(int temp)
    {
        /.../
    }
    int main()
    {
        int x;
        foo(x); /* here a temporary copy of the 'x' is created and sent to the foo function.*/
    
    }
    

    通过引用调用(在c语言中没有这样的概念)

    int foo(int& temp)
    {
       /.../
    }
    int main()
    {
        int x;
        foo(x); /* here no temporary copy of 'x' is being created rather the variable *temp* in the calling function is just another name of the variable a in the main function*/
    }
    

    按价值传递参数意味着您正在传递副本:

    void f(int x) 
    { 
        x = 7;
        // x is 7 here, but we only changed our local copy
    }
    
    void g()
    {
        int y = 3;
        f(y);
        // y is still 3 here!
    }
    

    通过引用传递参数意味着你没有传递一个副本,而是通过某种方式引用原始变量。 在C中,所有的参数都是按值传递的,但通常通过引用来传递相同的效果是传递一个指针:

    void f(int *x_ptr) { *x_ptr = 7; }
    
    void g()
    {
        int y = 3;
        f(&y);
        // y is 7 here 
    }
    

    数组的传递方式与传递引用相似,但实际发生的事情更为复杂。 例如:

    void f(int a[]) { a[0] = 7; }
    
    void g()
    {
        int b[3] = {1,2,3};
        f(b);
        // b[0] is 7 here! looks like it was passed by reference.
    }
    

    这里实际发生的是数组b被隐式转换为指向第一个元素的指针(这被称为衰减)。 参数fint a[]表示法实际上是指针的语法糖。 以上代码相当于:

    void f(int *a) { a[0] = 7; }
    
    void g()
    {
        int b[3] = {1,2,3};
        f(&b[0]);
        // b[0] is 7 here
    }
    
    链接地址: http://www.djcxy.com/p/20615.html

    上一篇: What is byValue and byReference argument passing In C?

    下一篇: doesn't execute as I want it