C 中的参数传递 - 指针、地址、别名

Parameter Passing in C - Pointers, Addresses, Aliases

有人可以解释一下 C 中参数传递的区别吗? 根据教授的笔记,有4种不同的方式来传递参数

  1. 按值调用
  2. 按地址调用(指针)
  3. 别名调用
  4. 全局变量/静态变量

如果你能举个例子,我将不胜感激,你的工作将受到赞扬。

  1. 按值调用

    将值作为参数传递给函数。如果函数修改变量,实际变量不会改变。

    void fun1(int myParam)
    {
        myParam = 4;
    }
    
    void main()
    {
        int myValue = 2;
        fun1(myValue);
        printf("myValue = %d",myValue);
    }
    

    myValue 永远是 2.

  2. 按地址调用(指针)

    void fun1(int *myParam)
    {
        *myParam = 4;
    }
    void main()
    {
        int myValue = 2;
        fun1(&myValue);
        printf("myValue = %d",myValue);
    }
    

    这里我们将 myValue 的地址传递给 fun1。所以 myValue 的值在 main().

  3. 的末尾将是 4
  4. 别名调用

    据我了解,C 中没有别名。应该是C++的引用机制。

  5. 全局变量/静态变量

    全局变量和静态变量是存储在公共位置的变量,可供调用者和被调用者函数访问。因此调用者和被调用者都可以访问和修改它们。

    int myValue = 2;
    void fun1()
    {
        myValue = 4;
    }
    void main()
    {
        myValue = 2
        fun1();
        printf("myValue = %d",myValue);
    }
    

    如你所料,myValue的值在main()的最后会是4。

希望对您有所帮助。

C按值、句点传递所有函数参数;形式参数(在定义中)是内存中与实际参数(在调用中)分开的对象。对形式参数的任何更新都不会影响实际参数。您可以使用指针伪造按引用传递语义,但指针是按值传递的。

真正的按引用传递意味着形参和实参引用内存中的同一个对象,因此对形参的任何更改也会影响实参。实际上,一个类似指针的对象被传递给子例程,但这对程序员是隐藏的。

C 不支持按引用传递。 C++ 支持使用特殊运算符的按引用传递。老式 Fortran 是通过引用传递的。

全局变量对调用者和被调用者都是可见的。

无法与传递名称或传递别名通话;从未使用过使用该机制的语言。