当前位置:龙翔文秘网 > 专题范文 > 公文范文 >

浅谈C++语言的函数参数传递

| 浏览次数:

摘 要 介绍了C++编程函数的定义和意义,说明了参数所对应变量存储情况,以数据交换的函数为例,分析了形参为值、指针和引用的参数传递和程序执行过程,得出了通过传递指针或者传递引用的方式可以把形参的改变传递给实际参数。

关键词 函数 引用 指针 参数

中图分类号:TP312 文献标识码:A DOI:10.16400/j.cnki.kjdks.2019.06.021

Discussion on Functional Parameter Transfer in C++ Language

ZHAO Huihui[1], DU Min[1], WANG Li[2], TAO Jun[1]

([1] Department of Computer and Software, Anhui Institute of Information Technology, Wuhu, Anhui 241000;

[2] Anhui Electric Power Communications Branch of State Grid, Hefei, Anhui 230061)

Abstract The definition and significance of C++ programming function are introduced, and the storage of variables corresponding to parameters is explained. Taking the function of data exchange as an example, the process of parameter transfer and program execution with parameters as values, pointers and references is analyzed. It is concluded that the change of parameters can be transmitted to actual parameters by transferring pointers or references.

Keywords function; references; pointers; parameters

0 概論

C++语言是一门重要的面向对象的教学语言,其具有封装、继承和多态的面向语言的特征,在计算机科学的教学过程中,C++语言是一门重要的专业基础课,对于学生掌握计算机编程技术有着重要的意义。

函数是C++编程语言一种重要机制,其使程序变得更简短和清晰,而且让程序易于理解,这就有利于程序维护,又可以提高程序员的程序开发的效率,提高了代码的重用性。

函数分成自定义函数和主函数main函数,其中main函数是程序运行的入口,函数由函数声明和函数体构成,函数声明又包括函数返回值类型、函数名称和函数的形式参数,形式参数负责接受函数调用方的实际参数的传递,函数接受到实际参数后在函数体中进行执行得到返回值,最后把返回值送给调用方,有些自定义函数是没有返回值的,这类函数的返回值类型为void。

在C++实际的教学中,因为参数类型有多种多样,比如值、指针和引用,同学们对函数传递往往感到困惑,本文在介绍变量存储的前提下,详细分析了实际参数和形式参数的传递过程以及如何通过函数运行来达到改变实际参数所对应的值。

1 变量的存储

一个C++的程序占用的存储主要为:栈,其在程序运行时由编译器自动分配,存放函数的参数值和局部变量的值; 堆,其是在内存中开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时由操作系统回收;全局区,其在编译器编译时得到分配内存。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,程序结束后操作系统会自动释放其存储空间。文字常量区,其负责存储常量字符串,程序结束后由操作系统释放。程序代码区,其负责存放函数体的二进制代码,程序结束后由操作系统释放。

函数的实际参数一般都是main()函数中局部变量,经过参数传递后变成所调用函数中的局部变量,这两种变量一般都是存储在栈中,栈会给它们分配存储地址,存储地址本质上是一个32位的没有符号的2进制整数,其表现形式为一个8位的16进制数,如一个整型变量q的值为10,程序执行时为其分配的地址是0x2222eeee,具体如图1。

从图中可以看到q的存储地址0x2222eeee,需要注意的是存储地址一般是指存储开始地址,q是4个字节的整形变量,其所占用的存储空间为0x2222eeee到0x2222eef2共有4个字节。函数接受实际参数后生成的变量只在函数体内有效,当函数执行完毕后,此变量会被操作系统销毁而不复存在。

1.1 指针

指针是指地址,是一个没有符号的32位数,其负责存储具体的数值和结构,其可以存储整型值、字符、字符串,也可以存储结构体、对象和函数等。而指针变量是一个变量,其存储的是一个指针,而不是具体的数值和结构。

有以下的代码:int p=4,*q; q=&p;这里p是一个整形变量,&p是存储p的指针,&p里存的值为4。q是一个指针变量,q的值为&p,而&q是存储q的地址,具体如图2所示。

&p是一个32位没有符号的整数。0x13456789,是一个指针,其里面存储的数据为p;q是一个指针变量,其值等于0x13456789,而q存储在指针&q(0x236567ae)中。

1.2 引用

引用指一个变量的别名,操作系统并不会给引用开辟新的存储空间,其和其引用的变量使用相同的存储地址,由于使用相同的存储的地址,引用的值改变后,相关变量的值也会发生改变,同理当相关变量的值改变后,引用的值也会改变,如以下代码:

int p=4; int&q=p; p=5;q=10;其相关的具体的地址分配如图3。

p是一个变量,q是关于p的引用,从图中可以看到p和q其实是存储在同一地址0x123456789当中的,无论是p或者是q发生了变化,p和q都用是相同的值,比如p=5后,尽管未对q赋值,q也会变成5。q=10后,未对p进行赋值,p也会变成10。

2 函数的传递

函数的传递一般是指main( )函数把实际参数传递给自定义函数f( )中的形式参数,函数的参数类型可以是具体的值,也可以是指针和引用,参数的类型不同,传递后的运算结果也可能不同,下面以两个数交换的函数来分析参数传递以及程序执行的结果。

2.1 形式参数为值

具体代码如下:

void swap(int x, int y)

{ int temp;

temp=x; x=y;y=temp;}

void main( )

{ int a=4,b=3;

swap(a,b);

cout<

程序执行时,变量存储的情况如图4所示。

swap函数执行前,操作系统为实参a、b分配的存储地址分别为0x1111eeee和0x2222eeee;swap函数执行时,实参a,b继续存在,操作系统为形参x、y分配的存储地址分别为0x3333eeee和0x4444eeee;swap函数执行时,main函数会把实参a和b的值传递给形参x和y,swap函数执行后,形参x、y的信息(包括地址和值)被销毁,而实际参数a,b的值保持不变,因为此时形参无法把交换的值回传给实参,参数值传递是单向的,形参x、y只是在swap函数体内交换成功,但无法对main函数中的实际参数起作用。

2.2 形式参数为值

2.2.1 传指针交换指针对应的数值

具体代码如下:

void swap(int *x, int *y)

{ int temp;

temp=*x; *x=*y;*y=temp;}

void main( )

{ int a=4,b=3;

swap(&a,&b);

cout<

程序执行时,参数存储的情况如图5所示。

swap函数执行前,操作系统为实参a、b分配的存储地址分别为0x1111eeee和0x2222eeee;swap函数执行时,实参a,b继续存在,操作系统为变量x、y分配的存储地址分别为0x3333eeee和0x4444eeee,但此时x和y是指针变量,其存储的不是a和b的值,而是a和b对应的存储地址,此时函数交换的不是x和y,而是x和y对应的整数值,交换前后a和b的存储地址与x和y的值是相同的,但是交换后这两个存储地址中的值却进行了交换,swap函数执行后,x和y被销毁, a=3、b=4。

2.2.2 传指针交换指针

具体代码如下:

void swap(int *x, int *y)

{ int *temp;

temp=x; x=y;y=temp;}

void main( )

{ int a=4,b=3;

swap(&a,&b);

cout<

程序执行时,参数存储的情况如图6所示。

swap函数执行前,操作系统为实参a、b分配的存储地址分别为0x1111eeee和0x2222eeee;swap函数执行时,实参a,b继续存在,操作系统为形参x、y分配的存储地址分别为0x3333eeee和0x4444eeee,此时x和y也是指针变量,其存储的不是a和b的值,而是a和b对应的存储地址,此时函数交换x和y,交换后x和y的值发生了交换,但是交换后这两个存储地址中的值却没有交换,swap函数执行后,x和y被销毁, a=4、b=3,没有发生变化。

2.3 形式参数为引用

具体代码如下:

void swap(int&x, int&y)

{ int temp;

temp=x; x=y;y=temp;}

void main( )

{ int a=4,b=3;

swap(a,b);

cout<

程序执行时,参数存储的情况如图7所示。

swap函数执行前,操作系统为实参a、b分配的存储地址分别为0x1111eeee和0x2222eeee;swap函数执行时,实参a、b继续存在,因为形式参数为引用,操作系统不为形参x、y分配的新的存储地址,此时x和y的存储地址与a和b的存储地址是相同的,此时函数交换x和y,交换后x和y的值发生了交换,a和b的值也发生了变化,swap函数执行后,x和y被销毁, a=3、b=4,a和b的值发生了变化。

通过上述四种情况可以看出,形参和实参的类型是具体的数值时,此时形参的改变是无法改变实参的;形参和实参的类型是指针时,如果在自定义函数f()中修改指针參数中存储的数据,是能够实现修改实参指针中存储的数据,如果只是修改自定义函数f()中形参的,是无法实现修改实参指针中存储的数据;形参和实参的类型是引用时,是能够通过修改形参值来达到修改实际参数的值,而且这种方式最为简洁使用。

3 总结

本文介绍了C++函数的定义和意义,简要说明了函数的四个组成部分:返回类型、函数名、形式参数和函数体,说明了函数形式参数在接受过实际参数后所生成的变量的存储情况,此时变量一般存储在栈中,当函数执行完毕后,这些变量也会被操作系统销毁掉。形式参数的类型会影响程序运行结果,本文以一个两个数的交换函数为例,详细分析了形式参数为值、指针和引用时的交换过程和执行结果,很好的消除了同学们在学习参数传递过程中的疑惑。

安徽省教育厅质量工程项目“计算机网络基础教学团队”(基金号:2017jxtd145),陶骏。安徽信息工程学院核心专业课程建设项目”数据结构与算法”(基金号:2018xjkcjs02),陶骏

参考文献

[1] 邓俊辉.数据结构(C++语言版)[M].北京:清华大学出版社,2013:45-60.

[2] 赵立波.软件工程专业以软件导论课程为中心的课程群建设探索[J].高教学刊,2019(04):58-60.

[3] 李海军.计算机程序设计类课程的实验教学研究[J].计算机时代,2019(02):89-91.

[4] 王会婷,陈应祖.《C/C++语言程序设计》课程考试系统的开发与应用[J].软件工程,2019.22(02):51-53.

[5] 丁岚,范开勇,冯振颖.面向对象程序设计方法研究[J].数字通信世界,2019(01):73-74.

[6] 赵春泽,钱鹰,张力生.基于计算思维的软件工程专业程序设计基础课程的教学改革探究[J].教育现代化,2018.5(53):67-69.

[7] 于寅骅.C++程序设计课程教学的思考[J].西部素质教育,2018.4(22):113-114.

[8] 潘磊,王琦,王丹华.数据结构课程教学改革研究[J].科技创新导报,2018.15(24):228-231.

[9] 谭火彬,林广艳.培养软件工程思想的面向对象程序设计课程改革与实践[J].计算机教育,2018(08):53-58.

[10] 张程乾.软件工程技术发展的趋势研究[J].数字技术与应用,2018.36(08):195,197.

[11] 宋琦,王冠宇,张力生.软件工程型人才培养体制下的《C++程序设计》课程“321”新模式[J].现代计算机(专业版),2018(01):51-54.


推荐访问:浅谈 函数 传递 参数 语言

热门排行

2023年党章全文9篇(完整文档)

党章全文1978年12月,十一届三中全会重新确立了马克思主义的思想路线,及时果断地把党和国家的工作重心转移到社会主义现代化建设上来,再次实现了党的历史性转折

大学生二十大的学习心得9篇(范文推荐)

大学生二十大的学习心得中国共产党第二十次全国代表大会,是在全党全国各族人民迈上全面建设社会主义现代化国家新征程、向第二个百年奋斗目标进军的关键时刻召开的

2022年最新社保补缴规定(全文)

社会是一种缴费性的社会保障,资金主要是用人单位和劳动者本人缴纳,政府财政给予补贴并承担最终的责任。下面是小编为大家整理的2022最新社保补缴规定,仅供参考...

2022年教育部初中生必读书目30本(全文)

通过读书,我们可以更好的掌握外界的知识,去提高自己的谈吐以及能力。下面是小编给大家带来的部推荐初中生30本,希望能够帮到你哟!初中生必读书目30本1、《西游...

2023年度学习党的二十大精神思想汇报3篇

学习党的二十大精神思想汇报拥抱新时代,带领人民不断创造美好生活;标定新方位,领航中华民族继续开创复兴伟业。党的二十大吹响了新时代推进中国特色社会主义

民主评议党员登记表自我评价意见12篇【完整版】

民主评议党员登记表自我评价意见本人以一个共产党员的准则严格要求自己,做到思想上先进,行动上先进,获得上级领导的好评和肯定。一、思想上思想上,认真学习党...

2022“牢记领袖训词,永做忠诚卫士”主题教育题研讨发言材料(共三篇)

0“牢记领袖训词,永做忠诚卫士”主题教育题研讨发言材料(共三篇)第一篇根据“牢记领袖训词,永做忠诚卫士”主题教育第一专题研讨交流安排,下面我简单汇报个...

2022年度理论学习中心组学习计划(全文完整)

0年度理论学习中心组学习计划0年是党的二十大召开之年,也是实施“十四五〞规划、开启全面建设社会主义现代化国家新征程的关键一年。深入学习落实新时代中国特色...

2023年党员个人问题清单及整改措施15篇

党员个人问题清单及整改措施问题一、思想认识不到位,敷衍应付走过场。对民主评议党员工作的重要性、严肃性存在认识偏差,认为民主评议党员无非就是“画个圈,打...

能力作风建设实施方案(全文)

能力作风建设实施方案为进一步提升旅游局机关能力作风建设,全面落实《关于开展能力作风建设提升年活动的实施意见》,以发挥旅游在现代服务业中的龙头作用,经局...