直接传值、引用传值、指针传值的调试经验

1、引用与取地址符的区别

引用在右边,取地址符号在左边,例如:

//a是i的引用 a和i有相同的地址 a是i的别名
//引用不能为空
int i=0;
int &a=i;


//如下是取地址符号 其中b为指向int型j变量的指针
int j=0;
auto b=&j;

2、测试直接传值、引用传值和地址传值

void swap(int  a, int b) //2.1
{

	int temp=a;
	a = b;
	b = temp;
	
}


/*
void  swapptr(int *pa, int *pb)   //2.2   该种写法不能实现转换,因为只是交换了pa pb的地址 比如原来pa指向0x1地址 存的值是10 pb指向0x02地址 存的值是20
                                        //现在使得pb指向10的地址 pa指向20的地址,但输出时是按地址来输出的,0x1地址仍然存的是10  没有改变。
{
	int *temp1 = pa;      //两个变量去操作的是地址 
	pa = pb;
	pb = temp1;
}
*/

void  swapptr(int *pa, int *pb) //2.3
{
	int temp1 = *pa;      //两个变量去操作的是地址 
	*pa = *pb;
	*pb = temp1;
}


/*
void swapyin(int &yina, int &yinb) //2.4
{
	int &temp2 = yina;
	yina = yinb;
	yinb = temp2;
}
*/

void swapyin(int &yina, int &yinb) //2.5
{
	int temp2 = yina;
	yina = yinb;
	yinb = temp2;
}


int main(void)
{
	int ar = 10;
	int br = 20;
	swap(ar,br);
	std::cout << ar << " " << br << endl;
	swapptr(&ar,&br);
	std::cout << ar << " " << br << endl;
	swapyin(ar,br);
	std::cout << ar << " " << br << endl;
	system("pause");

	return 0;
	
}

3、调试看内存

3.1 对于2.1来说,a,b值将ar和br拷贝了一份存在不同的地址中,a,b与ar与br的地址是不同的,如下图所示:

temp变量是将83c地址中的10和840地址中的20交换,因为ar和br的地址及地址中的值并没有变换,所以swap函数执行完并没有交换两者的值。

  temp变量是将83c地址中的10和840地址中的20交换,因为ar和br的地址及地址中的值并没有变换,所以swap函数执行完并没有交换两者的值。

 

3.2 对于第2条中2.3来说,temp1做为临时变量,开辟空间,储存ar地址920中的值,接下来将地址914中值赋给920地址,然后将原来ar中的值,赋值到914,实现了互换。

转换之前:

转换之后:

 

3.3 对于对于第2条中2.5来说,temp2保存了yina中的引用值,然后将b中的引用值赋值给a,原来a中的引用值赋值给b,因为yina是传进参数ra的引用,所以它们有相同的地址,于是该方法也可以实现两个变量之间的交换,最终又变成10、20。

交换前:

 

 交换后:

 输出结果如下图所示:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值