赞
踩
C++ 参数的三种传递方式分别是值传递、指针传递和引用传递。
值传递的实质
值传递的特点
值传递的应用场景
例子1:我们首先讲值传递,并且把它的特性列出来。下面我们先看代码:
void test(int a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}
这是一个简单的值传递,而地址就是内存位置,学过C++的人都清楚,下面是运行的结果
根据代码和结果我们可以知道的是值传传递的参数是有自己的内存的,并且当b把自己的值传递进去之后,对b是没有影响的,那么值传递则是等于把b的值赋给了a等于进行了一个赋值操作这就是值传递。
指针传递的实质
特点
运用场景
例子2:接下下来我讲指针传递,下面是指针传递的代码:
void test(int *a) {
*a += 3;
cout << “a所指向地址:” << a << “\n”
<< “a的地址:” << &a << “\n”
<< “a所指向地址的值:” << *a << “\n”;
}
void main()
{
int b = 10;
test(&b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}
这是一个指针传递,可以明显的发现和值传递的差别,指针是存储地址的,当我们想要把b的值传进test()函数时,我们传的是b的地址,然后通过b的地址,来获得b的值,下面是结果
我们输出的跟值传递不同的是什么呢,很明显的是这次输出的地址比值传递多一个地址,那这个多的地址和b的地址一模一样,可以说明的是指针传递的是地址,然后还有不同的是b的值也被改变了,这就指针传递和值传递的不同。
引用传递的实质
特点
运用场景
例子3:最后一个是引用传递,引用传递,传递的是什么呢?它和值传递、指针传递不同的地方是什么呢,下面是代码:
void test(int &a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}
在代码上是不是发现和值传递差不多,只是参数声明哪里比值传递的多了一个&符号其他的和值传递一样,但是就是在参数声明哪里多一个&符号,它就不是值传递,它的传递方式和值传递的是完全不一样的,所以在写参数声明时,要注意不要在你需要的引用传递时漏了一个&符号,它们的不同之处在哪里呢,我们看输出结果就知道了,下面是结果:
可以发现的是a的值和b的值是一样的,上面我们说指针传递时,是输出了一个a所指向地址的值,它的值和b的值是一样,那么引用是不是和指针一样传的地址呢,其实不是的因为引用传递其实是等于把b作为test()函数的全局变量,为什么这样说呢,是因为a的地址和b相同,然后a所做的所有操作都等于b做的,这a像是b的什么呢,这是名字不同,其他一样,a其实就是b的一个别名,所以test()函数对a的所有操作,都等于对b进行,而a只是b的另外一个标识。
那么有人对引用传递还有疑惑对吧,&在参数处是引用在所有非参数声明处都是获取某个变量的地址。还有就是引用可不可以解地址对吧,其实是不可以的,我们可以看一下它如果对引用解地址的话会报什么错误。下面错误提示
它提示的*(解址符)的操作数必须是指针,意思只能对指针进行解址,对其他的类型是不能解址的。
总结:
然后我们总结一下值传递、指针传递和引用传递不同的地方,首先它们都是可以把值传递给函数的只不过是传递的方式不同,有一点是可以很明显的,指针传递和引用传递都会改变b的值,值传递不会,这就是值传递和另外的区别,而指针传递和引用传递的不同的地方则是指针传递的是b的地址,而引用传递则等于给b起了一个别名,然后通过别名来操作b的值,和它所在的内存地址。
总而言之
值传递:形参开辟内存空间,与形参不同的地址,不能改变值。(变量名的访问)
地址传递:形参不开辟内存空间,与形参相同的地址,能改变值。(地址的访问)
引用传递:形参开辟内存空间,与形参相同的地址,能改变值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。