指针传递和引用传递

指针与引用传递解析
本文探讨了指针传递和引用传递的区别与联系。指针传递实际上是对地址变量的复制,而引用传递则是直接使用变量本身,相当于创建了一个别名。文章通过实例展示了这两种传递方式如何影响函数内部变量及外部调用者。

指针传递也属于值传递!

因为指针本质就是个地址变量,所以指针传递的参数也是个变量!

同时需要注意的是,指针传递是把地址变量复制一份再传递给函数的!

而引用传递是把本体传递给函数,并没有通过复制!

代码:
在这里插入图片描述
输出结果:

在这里插入图片描述
注意:
指针传递的函数里面的变量a由于和main函数的作用域不同,属于两个不同的变量。

可以清晰地看到:

指针传递的实参在函数内部该改变了指向,改变了函数内输出时的结果,但是丝毫不影响main函数的输出结果,因为传递过去的地址变量是个复制品。

而引用传递的地址,从头至尾都没有发生改变,因为引用即是其本身,相当于变量自身的别名,也因为这个特性:一旦引用被初始化为一个对象,就不能被指向到另一个对象,使得不用担心引用被改变。

传递指针传递引用传递是C++中函数参数传递的三种方式,它们有不同的原理特点: ### 值传递传递过程中,被调函数的形式参数作为被调函数的局部变量处理,在栈中开辟内存空间存放由主调函数传入的实的值,从而成为实一个副本。被调函数对形式参数的修改不会影响主调函数中的实,因为操作的是实的副本。值传递适用于不需要修改实的简单场景[^1][^2]。 以下是值传递的代码示例: ```cpp #include <iostream> // 值传递函数 void valuePassing(int num) { num = num + 1; // 修改副本的值 std::cout << "Inside function: num = " << num << std::endl; } int main() { int a = 10; valuePassing(a); std::cout << "Outside function: a = " << a << std::endl; return 0; } ``` ### 指针传递 指针传递本质上是值传递的方式,它所传递的是一个地址值。被调函数接收的是实的地址,通过对该地址进引用操作,可以访问修改主调函数中的实。不过,如果在被调函数中改变指针本身的地址,不会影响主调函数中的指针。若想通过指针参数传递来改变主调函数中的相关变量,可使用指向指针指针,或者指针引用指针传递适合需要在函数内部修改数据或者实现复杂操作的场景[^1][^2][^3][^4]。 以下是指针传递的代码示例: ```cpp #include <iostream> // 指针传递函数 void pointerPassing(int* ptr) { *ptr = *ptr + 1; // 修改指针指向的值 std::cout << "Inside function: *ptr = " << *ptr << std::endl; } int main() { int a = 10; int* pa = &a; pointerPassing(pa); std::cout << "Outside function: a = " << a << std::endl; return 0; } ``` ### 引用传递 引用传递时,在被调函数栈空间上有一个局部变量,任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。也就是说,引用传递让被调函数可以直接操作主调函数中的实引用传递同样适合需要在函数内部修改数据或者实现复杂操作的场景[^1][^3]。 以下是引用传递的代码示例: ```cpp #include <iostream> // 引用传递函数 void referencePassing(int& ref) { ref = ref + 1; // 修改引用所绑定的值 std::cout << "Inside function: ref = " << ref << std::endl; } int main() { int a = 10; referencePassing(a); std::cout << "Outside function: a = " << a << std::endl; return 0; } ``` ### 区别总结 - **对实的修改影响**:值传递不会修改主调函数中的实指针传递可通过解引用修改实,但改变指针地址不影响主调函数引用传递能直接修改主调函数中的实[^1][^3]。 - **传递内容**:值传递传递的是实的值;指针传递传递的是实的地址;引用传递可看作是实的别名,本质上传递的是实本身[^2][^3]。 - **使用场景**:值传递适用于不需要修改实的简单场景;指针传递引用传递适合需要在函数内部修改数据或者实现复杂操作的场景[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值