详解C++ 参数的三种传递方式和应用场景

 更新时间:2023年06月09日 10:21:20   作者:my_angle2016  
这篇文章主要介绍C++ 参数的三种传递方式和应用场景,C++ 参数的三种传递方式分别是值传递、指针传递和引用传递,感兴趣的同学可以参考阅读下

值传递

值传递的实质

  • 将实参的值(a、b)复制到形参(m、n)相应的存储单元中,即形参和实参分别占用不同的存储单元。

值传递的特点

  • 值传递的特点是单向传递,即主调函数被调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。

值传递的应用场景

  • 适用于传递简单的数据类型,如int、float、double等。传值是将参数的值传递给函数,函数内部会创建一个新的变量来存储该值,对该变量的修改不会影响原变量的值。

例子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的值,和它所在的内存地址。

总而言之

值传递:形参开辟内存空间,与形参不同的地址,不能改变值。(变量名的访问)

地址传递:形参不开辟内存空间,与形参相同的地址,能改变值。(地址的访问)

引用传递:形参开辟内存空间,与形参相同的地址,能改变值。

到此这篇关于详解C++ 参数的三种传递方式和应用场景的文章就介绍到这了,更多相关C++ 参数传递方式和应用场景内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言小项目实战之通讯录功能

    C语言小项目实战之通讯录功能

    这篇文章主要介绍了如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • 四个例子说明C语言 全局变量

    四个例子说明C语言 全局变量

    这篇文章主要介绍了四个例子说明C语言 全局变量,全局变量是C语言语法和语义中一个很重要的知识点,首先它的存在意义需要从三个不同角度去理解,下面来看看这三个不同的内容分别是什么吧
    2022-04-04
  • C++类中的特殊成员函数示例详解

    C++类中的特殊成员函数示例详解

    这篇文章主要给大家介绍了关于C++类中特殊成员函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • C++用两个栈实现一个队列(面试官的小结)

    C++用两个栈实现一个队列(面试官的小结)

    这篇文章主要给大家介绍了关于C++用两个栈实现一个队列的相关资料,这是来自一名面试官的小结,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • C语言循环结构深入刨析

    C语言循环结构深入刨析

    C语言条件控制语句选择结构,是属于计算机的语言编辑,有在C语言条件控制中的语句选择结构的存在,即是C语言条件控制语句选择结构,循环控制语句是一个基于C语言的编程语句,该语句主要有while循环语句、do-while循环语句和for循环语句来实现循环结构
    2022-08-08
  • STL区间成员函数及区间算法总结

    STL区间成员函数及区间算法总结

    这篇文章主要汇总介绍了STL区间成员函数及区间算法,有需要的小伙伴可以参考下。
    2015-07-07
  • C语言测试n的阶乘和x的n次方

    C语言测试n的阶乘和x的n次方

    今天小编就为大家分享一篇关于C语言测试n的阶乘和x的n次方,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C语言对于volatile与gcc优化的探究

    C语言对于volatile与gcc优化的探究

    这篇文章主要介绍了C语言对于volatile与gcc优化的探究,volatile是一个特征修饰符(type specifier) volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。这是百度百科的介绍,那编译器是具体是怎么优化的呢
    2023-02-02
  • C++示例讲解string容器

    C++示例讲解string容器

    c++相比c的一个好处就是实现了很多的容器和泛型算法,使得程序员的工作得到了很大的简化,本文重点给大家介绍C++string容器基本概念讲解,需要的朋友参考下吧
    2022-07-07
  • FFRPC应用 Client/Server使用及原理解析

    FFRPC应用 Client/Server使用及原理解析

    这篇文章主要介绍了FFRPC应用 Client/Server使用及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论