值传递、指针传递、引用传递

说来惭愧,写了好几年的c/c++,虽然在指针和地址 以及 值传递、指针传递、引用传递 不会用错,但是在描述上确是模棱两可的状态,今天参照《C++ Primer》决定做一个归纳总结,让自己有更清晰的理解,不足之处,大家多多批判。

一:值传递

方法调用时,实际参数把它的值传递给对应的形式参数(创建一个参数副本),方法执行中形式参数值的改变不影响实际参数的值(因为形参是副本,不会影响到实参)

 

void  func(int b)
{
	printf("b1 = %d\n", b);
	b = 374;
	printf("b2 = %d\n", b);
}

int main(int argc, char* argv[])
{
	int a = 1;
	printf("a1 = %d\n", a);
	func(a);
	printf("a1 = %d\n", a);
	return 0;
}

运行结果:

a1 = 1
b1 = 1
b2 = 374
a1 = 1

二:指针传递

传递的是一个外部实参的地址,当被调用函数的形参发生变化时,实参也会变化;

void func(int *b)
{
	printf("b add = %p, %d\n", b, *b);
	*b  = 38;
}

int main(int argc, char* argv[])
{
	int a = 1;
	
	printf("a add = %p, %d\n", &a, a);
	func(&a);
	printf("->a add = %p, %d\n", &a, a);
	return 0;
}

运行结果:

a add = 0x7ffd9f72d0fc, 1
b add = 0x7ffd9f72d0fc, 1
->a add = 0x7ffd9f72d0fc, 38

三:引用传递

引用(reference)是为对象起了另外一个名字,如下面的这个例子变量val和refval的内存地址是相同的(refval指向val),通过别名(refval)原先的变量(val)也会被修改。

#include <stdio.h>
int main(int argc, char* argv[])
{
	int val = 1024;
	int &refval = val;        //refval指向val(是val的另一个名字)
	//int &refval2;             //报错,引用必须被初始化
	
	printf(" val add = %p\n", &val);
	printf(" refval add = %p, %d\n", &refval, refval);

	refval = 2;

	printf(" ------------ \n");
	printf(" val add = %p\n", &val);
	printf(" refval add = %p, %d\n", &refval, refval);

}

运行结果:

 val add = 0x7ffe6748c364
 refval add = 0x7ffe6748c364, 1024
 ------------ 
 val add = 0x7ffe6748c364
 refval add = 0x7ffe6748c364, 2

另一个例子,函数中的引用传递:

void test_ref_func(int &refval)
{
	printf("on test_ref_func val add =%p, %d\n", &refval, refval);
	refval = 352;
}

int main(int argc, char* argv[])
{
	int val = 1;
	
	printf("before test_ref_func aaa add = %p, %d\n", &val, val);
	test_ref_func(val);
	printf("after test_ref_func aaa add = %p, %d\n", &val, val);
	return 0;
}

运行结果:

before test_ref_func aaa add = 0x7ffc1110c7fc, 1
on test_ref_func val add =0x7ffc1110c7fc, 1
after test_ref_func aaa add = 0x7ffc1110c7fc, 352

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值