天天看点

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

说来惭愧,写了好几年的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
           

继续阅读