理解C++传值、传址、引用调用

使用C++很长时间,对一些最基本的知识点不求甚解,有时会犯很低级的错误,并且这些bug在调试中很难发现。以前只了解传值、传址、引用调用的区别,没有深入了解,今天稍微总结一下,今后慢慢深入。

1.传值调用

在传值调用时,实参被拷贝了一份,然后在函数体内使用,函数体内修改参数变量时修改的只是实参的一份拷贝,而实参本身没有改变。通过例子来看,代码运行结果:

void funcValue(int a_Fml)
{
	cout << "&a_Fml:" << &a_Fml << endl;
	cout << "a_Fml:" << a_Fml << endl;
}

int main()
{
	int a_Act = 123;

	cout << "&a_Act:" << &a_Act << endl;
	cout << "a_Act:" << a_Act << endl;

	funcValue(a_Act);

	system("pause");
	ret

  理解C++传值、传址、引用调用_第1张图片

 形参a_Fml是实参a_Act的一个拷贝,所以a_Fml与a_Act的地址不同,值相同。

2.传址调用

传址调用时,把实参的地址传给形参;指针作为参数在函数中传递的时候,它的实质依然是值传递,形参只是实参的一份拷贝,他们分别属于不同的两个指针变量。两个指针变量的地址肯定是不一样的,值是一样的,指向相同的内存。代码运行结果与传值调用结果一样。 

void funcAddr(int *a_Fml)
{
	cout << "&a_Fml:" << &a_Fml << endl;
	cout << "a_Fml:" << a_Fml << endl;
}

int main()
{
	int  temp = 123;
	int *a_Act = &temp;

	cout << "&a_Act:" << &a_Act << endl;
	cout << "a_Act:" << a_Act << endl;

	funcAddr(a_Act);

	system("pause");
	return 0;
}

理解C++传值、传址、引用调用_第2张图片

补充:如果在函数中改变了改变了a_Fml指向的内存空间,然后再对a_Fml进行操作,便不会影响a_Act。

3.引用调用

引用调用时,形参是实参的引用,实参与形参拥有相同的地址。系统对传过来的参数没有拷贝,不会有任何额外开销,直接使用原始变量的内存空间。所以说,引用调用是比传址更高效的调用方式。引用代码运行结果如下:

void funcRef(int &a_Fml)
{
	cout << "&a_Fml:" << &a_Fml << endl;
	cout << "a_Fml:" << a_Fml << endl;
}

int main()
{
	int a_Act = 123;;

	cout << "&a_Act:" << &a_Act << endl;
	cout << "a_Act:" << a_Act << endl;

	funcRef(a_Act);

	system("pause");
	return 0;
}

理解C++传值、传址、引用调用_第3张图片

你可能感兴趣的:(C/C++)