C++中传值传指针传引用的区别

当调用函数时,传递的参数有传值、传指针、传引用这三种形式。

直接传值是直接开辟了一个跟主函数实参一样的空间(地址不一样),里面存放了了跟实参一样大小的值,就相当于数值大小相同但是位置不同。你在这个调用函数里使用这个一样大小的值,完全不影响主函数实参的值。就好比主函数的空间就是一栋楼,里面的一个房间里放着一些东西(相当于实参变量值)。现在我调用了一个函数,就相当于我在另一栋楼的另一个房间里面,把刚才第一个放东西的房间里面存的东西完全复制过来,所以你操作现在这个房间里面的东西,完全不影响原来的房间的东西呀。

传指针就不一样了。指针就是地址,我们要去找一个房间里面的东西,那么你得先找到门牌号,才能对照着门牌号去找到房间,从而找到你想要的东西,这就是指针的使用原理。传指针就是把实参的地址传过去了,而不是像刚才传值一样,直接开辟一个新的空间去复制数值,而是开辟了一个新的空间把实参的地址复制了过去。主函数的空间就是一栋楼,里面的一个房间放着一些东西(相当于实参变量值),这个房间有个门牌号(也就是实参的地址)。现在调用函数,就好比我把他家的门牌号(实参的指针)给你,跟你说你按照这个门牌号去找这个房间,然后再去找里面的东西。这样一来,你根据门牌号找到了原来的房间,一旦修改房间里面的东西,就一定会产生改变。所以根据指针修改指向的变量时,如果调用函数进行了修改,主函数的变量也就被修改了。

传引用就是传指针的升级版。引用可以看成变量的别称,就好像Tony老师的本名就叫赵铁柱一样,名字不一样但是人就是那一个人。所以你传引用的时候,修改了调用函数里的传递参数值,主函数的对应变量也会随之改变。但是原理还是传递指针,也就是地址。传引用的时候实际上是拷贝了实参的地址,然后你在调用函数里的操作表面上看是对变量的直接赋值,实际上是通过找到地址再改变变量的,这是一种间接寻址。但是为啥不直接用指针找地址再操作呢?而是封装成引用的外表了,很大的原因是安全。因为直接指针操作,那你很可能改变了指针,然后就找不到原来的地址了。就好比,我现在要去找房间(调用了其他函数要去访问主函数的实参变量值),然后给了你一块门牌号(相当于指针,也就是地址),万一你一不小心掉沟里了,门牌号弄丢了(指针被错误的修改),那你就找不到原来的房子了呀,你要是还继续去找错误的房子,把别人家房子里面的东西改了,等下直接程序就出错了(走错家门很危险的…)。所以别人就是怕你乱改,直接就给你封装好了。引用其实还可以让代码更加简洁清晰,一目了然(因为就相当于同一个变量在操作的感觉)。C语言是没有传引用的,C++把它加上了。原因我觉得是更方便了,也更安全了。

下面看一下代码吧

#include<iostream>
using namespace std;
/*
	author: James-J
	time: 2019/02/28
*/
// 传值 
void fun_1(int num){
	num = 100;
	cout<<"In function 1 num = "<<num<<endl;
} 
// 传指针 
void fun_2(int *num){
	*num = 200;  // *num就是根据指针num找原来位置的变量
	cout<<"In function 2 num = "<<*num<<endl;
}
// 传引用 
void fun_3(int &num){
	num = 300;  // 引用的操作看起来就像是直接赋值一样
	cout<<"In function 3 num = "<<num<<endl;
}

int main(){
	int num = 0;
	cout<<"num = "<<num<<endl<<endl;
	// 传值 
	cout<<"Before function 1 num = "<<num<<endl;
	fun_1(num);
	cout<<"After function 1 num = "<<num<<endl<<endl;
	// 传指针
	cout<<"Before function 2 num = "<<num<<endl;
	fun_2(&num);  // 地址传过去
	cout<<"After function 2 num = "<<num<<endl<<endl;
	// 传引用
	cout<<"Before function 3 num = "<<num<<endl;
	fun_3(num);
	cout<<"After function 3 num = "<<num<<endl<<endl;
	return 0;
} 

结果

 

根据上面分析的,直接赋值时,调用函数改变形参值,主函数实参不改变。而传指针和传引用会改变,传指针需要进行取地址(&num)呀、找变量(*num)的操作,而传引用没有那么复杂,看起来就像是直接赋值一样,但其实传引用也是一些列地址的操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值