下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第#页CC语言中参数的传值问题第第1页C语言中参数的传值一直比较含糊,今天在网上看到三个面试题的详解,感觉讲的很好,就拿来记下,方便学习和记忆。1.考题一:程序代码如下:2.考题二:代码如下。3.考题三:voidExchg1(intx,inty)Exchg2(int*px,int*py)Exchg2(int&x,int&y){{{inttmp;inttmp=*px;inttmp=x;tmp=x;*px=*py;x=y;x=y;*py=tmp;y=tmp;y=tmp;print(“*px=%d,*py=%d/n”,*p:〈,*print( “x=%d,y=%d/n”,x,y);printf( “x=%d,y=%d/n”,x,y)py);}}}main()voidmain()main(){{{inta=4;inta=4,b=6;inta=4;intb=6;Exchg1(a,b);intb=6;Exchg2(a,b);printf( “a=%d,b=%d/n”,a,b)Exchg2(&a,&b);Print(“a=%d,b=%d/n”,a,b)}Print( “a=%d,b=%d/n”,a,b);}输出的结果:}输出的结果:x= ,y=输出的结果为:x= ,y=a= ,b=*px= ,*py=a= ,b=问下划线的部分应是什么,请完a= ,b=问下划线的部分输出的应是什成。问下划线的部分应是什么,请完成。么,请完成。你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧! )好,废话少说,继续我们的探索之旅了。我们都知道:C语言中函数参数的传递有:值传递,地址传递,引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧?下面请让我逐个地谈谈这三种传递形式。二、函数参数传递方式之一:值传递1.一个预备的常识为了说明这个问题,我先给出一个代码:inta=4;intx;x=a;x=x+3;看好了没,现在我问你:最终 a值是多少,x值是多少?(怎么搞的,给我这个小儿科的问题。还不简单,不就是 a==4x==7嘛!)在这个代码中,你要明白一个东西:虽然 a值赋给了x,但是a变量并不是x变量哦。我们对x任何的修改,都不会改变a变量。呵呵!虽然简单,并且一看就理所当然,不过可是一个很重要的认识喔。2.值传递的一个错误认识先看题一中Exchg1函数的定义:voidExchg1(intx,inty)//定义中的x,y变量被称为Exchg1函数的形式参数{inttmp;tmp=x;x=y;y=tmp;printf(“x=%d,y=%d/n”,x,y)}问:你认为这个函数是在做什么呀?答:好像是对参数x,y的值对调吧?请往下看,我想利用这个函数来完成对a,b两个变量值的对调,程序如下:voidmain(){inta=4,b=6;Exchg1(a,b)//a,b变量为Exchg1函数的实际参数。/printf(“a=%d,b=%d/n”,a,b)}我问:Exchgl()里头的printf( “x=%d,y=%d/n语句会输出什么啊?我再问:Exchgl()后的printf( "a=%d,b=%d/n”,a语句输出的是什么?程序输出的结果是:x=6,y=4a=4,b=6 //为什么不是a=6,b=4呢?奇怪,明明我把a,b分别代入了x,y中,并在函数里完成了两个变量值的交换, 为什么a,b变量值还是没有交换(仍然是a==4,b==6,而不是a==6,b==4)?如果你也会有这个疑问, 那是因为你跟本就不知实参 a,b与形参x,y的关系了。3.理解值传递的形式看调用Exch1函数的代码:main(){inta=4,b=6;Exchg1(a,b)//这里调用了Exchg1函数printf(“a=%d,b=%d”,a,b)}Exchg1(a,b)时所完成的操作代码如下所示。intx=a;//Jinty=b;// 注意这里,头两行是调用函数时的隐含操作inttmp;tmp=x;x=y;y=tmp;请注意在调用执行Exchg1函数的操作中我人为地加上了头两句:intx=a;inty=b;这是调用函数时的两个隐含动作。它确实存在,现在我只不过把它显式地写了出来而已。问题一下就清晰起来啦。(看到这里,现在你认为函数里面交换操作的是a,b变量或者只是x,y变量呢?)原来,其实函数在调用时是隐含地把实参 a,b的值分别赋值给了x,y,之后在你写的Exchgl函数体内再也没有对a,b进行任何的操作了。交换的只是 x,y变量。并不是a,b。当然a,b的值没有改变啦!函数只是把a,b的值通过赋值传递给了 x,y,函数里头操作的只是 x,y的值并不是a,b的值。这就是所谓的参数的值传递了。哈哈,终于明白了,正是因为它隐含了那两个的赋值操作,才让我们产生了前述的迷惑(以为 a,b已经代替了x,y,对x,y的操作就是对a,b的操作了,这是一个错误的观点啊!)。三.函数参数传递方式之二:地址传递继续——地址传递的问题!看题二的代码:Exchg2(int*px,int*py){inttmp=*px;*px=*py;*py=tmp;print(“*px=%d,*py=%d/n”,*px,*py);}main(){inta=4;intb=6;Exchg2(&a,&b);Print(“a=%d,b=%d/n”,a,b);}它的输出结果是:*px=6,*py=4a=6,b=4看函数的接口部分:Exchg2(int*px,int*py),请注意:参数px,py都是指针。再看调用处:Exchg2(&a,&b);它将a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px,py。px=&a;py=&b;呵呵!我们发现,其实它与值传递并没有什么不同,只不过这里是将 a,b的地址值传递给了 px,py,而不是传递的a,b的内容,而(请好好地在比较比较啦)整个Exchg2函数调用是如下执行的:px=&a;//py=&b;//请注意这两行,它是调用 Exchg2的隐含动作。inttmp=*px;*px=*py;*py=tmp;print(“*px=%d,*py=%d/n”,*px,*py);这样,有了头两行的隐含赋值操作。我们现在已经可以看出,指针 px,py的值已经分别是a,b变量的地址值了。接下来,对*px,*py的操作当然也就是对a,b变量本身的操作了。 所以函数里头的交换就是对 a,b值的交换了,这就是所谓的地址传递(传递a,b的地址给了px,py),你现在明白了吗?四.函数参数传递方式之三:引用传递看题三的代码:Exchg3(int&x,int&y)//注意定义处的形式参数的格式与值传递不同{inttmp=x;x=y;y=tmp;print(“x=%d,y=%d/n”,x,y);}main(){inta=4;intb=6;Exchg3(a,b);//注意:这里调用方式与值传递一样Print(“a=%d,b=%d/n”,a,b);}输出结果:x=6,y=4a=6,b=4//这个输出结果与值传递不同。看到没有,与值传递相比,代码格式上只有一处是不同的,即在定义处:Exchg3(int&x,int&y)。但是我们发现a与b的值发生了对调。这说明了 Exchg3(a,b)里头修改的是a,b变量,而不只是修改x,y了。我们先看Exchg3函数的定义处Exchg3(int&x,int&y)。参数x,y是int的变量,调用时我们可以像值传递(如:Exchg1(a,b);)一样调用函数(如:Exchg3(a,b);)。但是x,y前都有一个取地址符号&。有了这个,调用Exchg3时函数会将a,b分别代替了x,y了,我们称x,y分别引用了a,b变量。这样函数里头操作的其实就是实参a,b本身了,也就是说函数里是可以直接修改到 a,b的值了。最后对值传递与引用传递作一个比较:1.在函数定义格式上有不同:值传递在定义处是:Exchg1(intx,inty);引用传递在这义处是:Exchg1(int&x,in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国地理书籍行业市场运营模式及未来发展动向预测报告
- 2024-2030年中国园林古建筑行业发展前景规划研究报告
- 2024-2030年中国周界报警系统行业运营模式及发展战略分析报告
- 2024-2030年中国卫生洁净器行业供需状况发展战略规划分析报告
- 2024年生态保育合同范本
- 2024年环保装修材料购买协议3篇
- 微专题构建模型解读新信息-2024高考化学一轮考点击破
- 吕梁职业技术学院《体操类》2023-2024学年第一学期期末试卷
- 2024年样品提供协议范本下载版B版
- 2024年某企业与保险公司关于企业财产保险合同
- FOCUS-PDCA改善案例-提高术前手术部位皮肤准备合格率医院品质管理成果汇报
- 小家电产品供货服务方案
- 期末(试题)-2024-2025学年人教PEP版英语六年级上册
- 口腔科消毒隔离知识培训
- 企业新闻宣传培训
- GB/T 3488.1-2024硬质合金显微组织的金相测定第1部分:金相照片和描述
- 2025年广东省高等学校招生中等职业学校毕业生统一考试 英语押题卷(五)(含答案)
- 第六单元 百分数(单元测试)(含答案)-2024-2025学年六年级上册数学苏教版
- 专题07:回忆性散文阅读(考点串讲)
- 2024年云南省昆明滇中新区公开招聘20人历年(高频重点复习提升训练)共500题附带答案详解
- 医院检验科实验室生物安全程序文件SOP
评论
0/150
提交评论