C语言参数传递详解:值传递、指针与引用的区别

Evan
Evan
发布时间:2026-10-14 | 4人浏览过
原创

在C和C++编程中,函数参数传递机制是核心基础,主要包括值传递、地址传递和引用传递。理解这三种方式的底层行为差异,对于避免数据意外修改或实现高效的函数通信至关重要。

值传递:实参的副本

值传递是C语言中最基本的参数传递方式。当使用值传递时,系统会将实际参数的值复制一份给形式参数。形式参数仅是实参的一个副本,二者在内存中占据不同的空间。

第1步:定义与调用

在以下示例中,Exchg1 函数试图交换两个整数的值:

void Exchg1(int x, int y) {
    int tmp;
    tmp = x;
    x = y;
    y = tmp;
    printf("x=%d,y=%d\n", x, y);
}

void main() {
    int a = 4, b = 6;
    Exchg1(a, b); // 调用函数
    printf("a=%d,b=%d\n", a, b); // 打印主函数中的a和b
}

第2步:执行过程分析

调用 Exchg1(a, b) 时,发生以下隐含操作:
1. int x = a;(x初始为4)
2. int y = b;(y初始为6)

函数内部对 x 和 y 的操作仅影响副本。因此,printf("x=%d,y=%d\n") 输出 x=6, y=4。
然而,返回主函数后,原始变量 a 和 b 未被修改,printf("a=%d,b=%d\n") 输出 a=4, b=6。

第3步:结论

值传递中,形参的改变不会影响实参。这类似于将文件内容复印后修改复印件,原件保持不变。

地址传递:指向内存的指针

地址传递(通常指C语言中的指针传递)是将变量的内存地址传递给函数。函数通过解引用指针访问并修改该内存地址上的值。

第1步:定义与调用

void Exchg2(int *px, int *py) {
    int tmp = *px;
    *px = *py;
    *py = tmp;
    printf("*px=%d,*py=%d\n", *px, *py);
}

void main() {
    int a = 4;
    int b = 6;
    Exchg2(&a, &b); // 传入变量地址
    printf("a=%d,b=%d\n", a, b);
}

第2步:执行过程分析

调用 Exchg2(&a, &b) 时:
- px 获得 a 的地址
- py 获得 b 的地址

函数内部通过 *px 和 *py 直接操作 a 和 b 所在的内存单元。因此,交换成功后,printf("*px=%d,*py=%d\n") 输出 *px=6, *py=4。
返回主函数后,a 和 b 的值已被永久修改,输出 a=6, b=4。

第3步:结论

地址传递允许函数修改实参的值。它传递的是“钥匙”(地址),持有钥匙的人可以进入房间(内存地址)更改内部物品(数据)。

引用传递:变量的别名(C++特性)

引用传递是C++特有的机制。引用(Reference)是已存在变量的别名,对引用的操作等同于对原变量进行操作。

第1步:定义与调用

// 注意:这是C++代码,需在.cpp文件中编译
void Exchg3(int &x, int &y) {
    int tmp = x;
    x = y;
    y = tmp;
    printf("x=%d,y=%d\n", x, y);
}

void main() {
    int a = 4;
    int b = 6;
    Exchg3(a, b); // 看起来像值传递,但实质不同
    printf("a=%d,b=%d\n", a, b);
}

第2步:执行过程分析

虽然调用语法 Exchg3(a, b) 与值传递相同,但由于定义处使用了 &,编译器建立了 x 到 a、y 到 b 的绑定关系。
- x 就是 a
- y 就是 b

函数内的交换直接作用于原变量。输出结果为:
- 函数内:x=6, y=4
- 函数外:a=6, b=4

第3步:结论

引用传递兼具简洁性(调用时无需取地址符号)和高效性(无数据拷贝开销),且能直接修改实参。它在语义上是最接近“直接操作实参”的方式。

三种传递方式对比总结

特性值传递地址传递(指针)引用传递
C/C++支持C, C++C, C++C++ (C不支持)
参数定义func(int x)func(int *x)func(int &x)
调用写法func(a)func(&a)func(a)
是否修改原变量否是是
内存占用副本开销指针大小(通常4/8字节)无额外开销(别名)

以上就是C语言中参数传递的详细内容,更多关于C/C++基础教程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表