C与C++关于*与&的传参解析

本文详细介绍了C/C++中函数参数传递的两种主要方式:值传递和引用传递。值传递会创建实参的副本,而引用传递则允许直接修改原变量。通过实例代码展示了指针和引用如何影响函数内外的变量值,强调了引用作为传递地址的一种方式,其修改的是原始变量而非副本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者 | 李肖遥       责编 | 欧阳姝黎

函数参数传递主要有2种传递方式,值传递和引用传递,这个过程是实际参数将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的一个过程。

本文略过参数不是指针的情况,这种情况实际上是复制了一个外部变量的副本进入函数中,函数体内操作的为该副本,不会实际修改函数外的该变量。

为什么?被调函数的形参只有函数被调用的时候才会临时分配单元,一旦调用结束占用的内存便会释放,所以调用的函数中存储该参数的地址跟被调函数中参数的地址不同。往往我们对C与C++关于*与&的使用不是很清楚,C语言没有引用只有指针,引用是在C++里面才存在的操作。

参数为指针的情况(使用*)

这种情况实际上是在函数内部复制了一个指针的副本,如果单纯的修改指针,在跳出函数后,该指针指向不受影响;但如果修改的是指针指向的值,那么外部指针所指向的内容也相应修改了,因为两个指针都是指向同一个内存空间的。

用*运算取地址的内容,C++代码(C语言也一样的)如下:

#include <iostream> 
using namespace std;
 
void function(int* num){
 *num = 100;
}
 
int main()
{
 int number;
 number = 1;
 function(&number);
  
 cout << number << endl;
 return 0;
}
//输出100

形参num是一个指针,传递过来的是一个地址值,通过改变num对应地址的值来实现值的改变,解引用即可访问到这个地址值映射的值。

引用方式传值(使用&)

#include <iostream>
using namespace std;
 
void function(int& num){
 //通过引用改变num的值
 num = 100;
}
 
int main()
{
 int number;
 number = 1;
 function(number);
 cout << number << endl;
 system("pause");
 return 0;
}
//输出100

对引用的操作等于是对其指定的对象进行操作,当将实参传递给形参时,形参就指向了实参。

例子

#include <iostream>
using namespace std;

//测试如果引用进入函数后进行修改,跳出函数后变量是否修改;
void ChangeRef(int& ref) {
    ref++;
    cout << "引用内修改后的值为:" << ref << endl;
}

//测试以传值方式进入函数进行修改,跳出函数后变量是否修改
void ChangeNotRef(int ref) {
    ref++;
    cout << "通过传值方式在函数内修改后的值为:" << ref << endl;
}

//测试以指针为参数传入函数,修改指针指向,是否影响外部指针指向
void ChangePtr(int* ptr) {
    ptr++;
    cout << "函数内修改后的指针指向:" << ptr << endl;
}

//测试在函数中修改指针指向的内容,是否影响外部指针指向内容
void ChangePtrVal(int* ptr) {
    (*ptr)++;
    cout << "函数内修改后指针指向的值:" << *ptr << endl;
}

int main() {
    int Ref = 0;
    cout << "传入引用之前的值为:" << Ref << endl;
    ChangeRef(Ref);
    cout << "在函数内修改引用后,跳出函数的值为:" << Ref << endl << endl;

    ChangeNotRef(Ref);
    cout << "通过传值方式在函数内修改后,跳出函数的值为:" << Ref << endl << endl;

    int* ptr = &Ref;
    cout << "传入函数前的指针指向:" << ptr << endl;
    ChangePtr(ptr);
    cout << "传值方式传入函数跳出后的指针指向:" << ptr << endl << endl;

    cout << "传入前指针指向的值为:" << *ptr << endl;
    ChangePtrVal(ptr);
    cout << "从函数中出来后指针指向的值为:" << *ptr << endl << endl;

    system("pause");
    return 0;
}//参考网上例子

运行结果如下:

小结

值传递和引用传递,传递的都是实参的一个拷贝。

C语言中实参和形参之间的数据传递是单向。

被调用函数的形参只有函数被调用时才会临时分配存储单元,结束便会被释放。



☞不同芯片的 Mac 电脑,差距会逐渐拉大吗?☞乐视 logo 换新:显示“老板造车美利坚”;雷军给米粉起名小粽子;谷歌浏览器不再隐藏完整 URL|极客头条
☞“搏一搏,单车变摩托!”华为天才少年耗时四个月,将自行车强势升级为自动驾驶
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值