【问题标题】:Parameter Passing in C - Pointers, Addresses, AliasesC 中的参数传递 - 指针、地址、别名
【发布时间】:2026-01-23 03:20:03
【问题描述】:

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

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

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

【问题讨论】:

  • C 没有“别名调用”(无论这应该是什么意思)。 C++ 有引用(也许这就是它的意思?),但是 C++ 不是 C。

标签: c function pointers parameters parameter-passing


【解决方案1】:
  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()的末尾会是4。

  3. 别名调用

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

  4. 全局变量/静态变量

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

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

    你可以猜到,myValue 的值在main() 的末尾将是 4。

希望对你有帮助。

【讨论】:

  • 哇,非常感谢。这比我们程序中的教学方式更有意义。通过我已经知道的地址传递是一个非常有用且灵活的功能。我还可以看到为什么 Java 由于编译错误而没有包含它。我衷心感谢您的回复。
  • @FrankPalmisano Java 通过引用传递,事实上这是非原始类型的唯一选择
【解决方案2】:

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

真正的pass-by-reference意味着形参和实参引用内存中的同一个对象,所以形参的任何改变也会影响实参。在实践中,类似指针的对象被传递给子例程,但这对程序员是隐藏的。

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

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

不能通过姓名或别名说话;从未使用过使用该机制的语言。

【讨论】: