浅谈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.

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

【浅谈C++语言的函数参数传递】相关推荐

工作总结最新推荐

NEW
  • XX委高度重视党校的建设和发展,出台《创建全省一流州市党校(行政学院)实施方案》及系列人才培养政策,为党校人才队伍建设提供了有力的政策支撑。州委党校在省委党校的悉心指导下、州委的正确领导下,深入贯彻落

  • 为推动“不忘初心、牢记使命”主题教育常态化,树牢“清新简约、务本责实、实干兴洛”作风导向,打造忠诚干净担当、敢于善于斗争的执纪执法铁军,经县纪委常委会会议研究,决定在全县纪检监察系统开展“转变作风工作

  • 为进一步发展壮大农村集体经济,增强村级发展活力,按照中共XXX市委抓党建促乡村振兴工作领导小组《关于印发全面抓党建促乡村振兴四个工作计划的通知》要求,工作队与村“两委”结合本村实际,共同研究谋划xx村

  • 今年来,我区围绕“产城融合美丽XX”总体目标,按照“城在林中,水在城中,山水相连,林水相依”以及“城乡一体、景城一体、园城一体”的建设思路,强力推进城市基础设施建设、棚户区改造、房地产开发和城市风貌塑

  • 同志们:新冠疫情发生至今已有近三年时间。三年来,在广大干群的共同努力下,我们坚决打好疫情防控阻击战,集团公司范围内未发生一起确诊病例,疫情防控工作取得了阶段性胜利。当前国际疫情仍在扩散蔓延,国内疫情多

  • 我是毕业于XX大学的定向选调生,当初怀着奉献家乡、服务人民的初心回到XX,在市委的关心关爱下,获得了这个与青年为友的宝贵历练机会。一年感悟如下。一要对党忠诚,做政治坚定的擎旗手。习近平总书记指出,优秀

  • 同志们:今天召开这个会议,主要任务是深入学习贯彻习近平总书记重要指示批示精神,以及李克强总理批示要求,认真落实全国安全生产电视电话会议和全省、全市安全生产电视电话会议精神,研究我县安全生产和安全隐患大

  • 2022年市委政研室机关党的建设工作的总体要求是:坚持以XXX新时代中国特色社会主义思想为指导,全面贯彻党的XX届X中X会和省、市第十二次党代会精神,自觉运用党的百年奋斗历史经验,弘扬伟大建党精神,深

  • 同志们:今天,我们在这里召开市直机关基层党建示范点工作会议,一方面是对各示范点单位进行表彰授牌,另一方面是想通过这种会议交流的方式,给大家提供一个相互学习、取长补短的平台和机会。市直工委历来把创建基层

  • 新冠疫情暴发以来,学校党委坚决贯彻习近平总书记关于疫情防控工作的指示要求和党中央的决策部署,严格执行×××部、×××厅关于疫情防控的系列要求,认真落实驻地防疫部门的工作举措,继承发扬优良传统,以最高标