c语⾔中add函数返回值,函数返回值的类型
函数的返回类型:函数返回值的类型.
return 语句只在函数内使⽤。它起到让函数停⽌运⾏,然后返回⼀个值的作⽤。
⼀个函数没有return;语句,也可以⾃然地结束,⽐如上⾯的代码⼀,当在屏幕上打印完第三⾏后,函数体内的代码也没了,所以函数⾃然就结束了,为什么还要return语句呢?
parameter数据类型下⾯的函数实现返回⼆数中的较⼤者:
int max(int a, int b)
{
if(a > b)
return a;
return b;
}
这个函数有两个return;但并不是说它会返回两次。⽽是根据条件来执⾏不同的返回。执⾏以下⾯代码来调⽤上⾯的函数: int c =
max(10,7); 得到的结果将是c等于10。
关于return的最后⼏句话是:
1、有些函数确实可以不需要return,⾃然结束即可;
2、有些⼈习惯为return的返回值加⼀对(),如: return (a); 这样写和 return a;完全⼀样。当然,在某些特殊的情况下,⼀对()是必要的。
3、⼀个函数是void类型时,return不能接返回,这时return仅起结束函数的作⽤。
4、记得return 接的是⼀个表达式,可以是⼀个⽴即数,⼀个变量,⼀个计算式,前⾯我们就看到 return a+b;的例⼦。 return 甚⾄也可以接⼀个函数。
----------------------------------------------------------------------------------
参数是调⽤函数的代码,传给函数的数据,在C,C++中,参数有两种传递⽅式:传值⽅式(它是程
序中最常见的传递参数的⽅法)和传址⽅式(函数对参数的操作,将直接改变实参的值)。这两个名词分别指:传递“参数的值”和传递“参数的地址”。
“参数的传递⽅式”,“参数的传递过程”,⽅式和过程有何区别?中学时我对前桌的⼥⽣“有意思”,想给⼈家传递点信息,是往她家打个电话呢?还是来个“⼩纸条”?这就是“传递⽅式”的不同。我选择了后者。⾄于传递过程:刚开始时我把纸条裹在她的头发⾥,下课时假装关⼼地“喂,你的头发⾥掉了张纸……”。后来⼤家熟了,上课时我轻轻动⼀下她的后背,她就会不⾃在,然后在⼀个合适时机,⾃动把⼿别过来取⾛桌沿的纸条……这就是传递过程的不同吧?(以上故事纯属虚构)
程序是在内存⾥运⾏的。所以⽆论参数以哪⼀种⽅式传递,都是在内存中“传来传去”。在⼀个程序运⾏时,程序会专门为参数开辟⼀个内存空间,称为“栈”。栈所在内存空间位于整个程序所占内存的顶部(为了直观,我们将地址较⼩的内存画在⽰意图顶部,如果依照内存地址由下⽽上递增规则,则栈区应该在底部),如图:
当程序需要传递参数时,将⼀个个参数“压⼊”栈区内存的底部,然后,函数再从栈区⼀个个读出参数。
如果⼀个函数需要返回值,那么调⽤者⾸先需要在栈区留出⼀个⼤⼩正好可以存储返回值的内存空间,然后再执⾏参数的⼊栈操作。
假设有⼀函数:int AddTwoNum(int n1, int n2) 然后在代码某处调⽤:
....
int a = 1;
int b = 2;
int c = AddTwoNum(a,b);
当执⾏上⾯⿊体部分,即调⽤函数的动作发⽣时,栈区出现下⾯的操作:
图中标明为返回值预留的空间⼤⼩是4个字节,当然不是每个函数都这个⼤⼩。它由函数返回值的数据类型决定,本函数AddTwoNum返回值是int类型,所以为4个字节。其它的a,b参数也是int类型,所以同样各占4字节⼤⼩的内存空间。
⾄于参数是a还是b先⼊栈,这依编译器⽽定,⼤都数编译器采⽤“从右到左的次序”将参数⼀个个压⼊。所以本⽰意图,参数b被
先“压”⼊在底部,然后才是a。这样就完成了参数的⼊栈过程。根据前⾯讲的不同“传递⽅式”,被实际压⼊栈的数据也就不同。
⼀、如果是“传值”,则栈中的a,b就是“复制品”,对⼆者的操作,仅仅是改变此处栈区的内存,和调⽤处的实参:a,b毫不关联:
⼆、⽽在“传址”⽅式时,编译器会将调⽤处的a,b的内存地址写⼊栈区,并且将函数中所有对该栈区内存的操作,都转向调⽤处a,b的内存地址。请看:
看起来⼆的图⽐⼀要复杂得多。其实实质的区别并不多。
在⼀图中,传给函数的是a,b的值,即1,2;
在⼆图中,传给函数的是a,b的地址,即:00129980,00129984。
“参数的传递过程”说到最后,还是和“参数的传递⽅式”纠缠在⼀起。我个⼈认为,在刚开始学习C++时,并不需要--或者甚⾄就是最好不要--去太纠缠语⾔内部实现的机制,⽽重在于运⽤。下⾯我们就来举⼀个使⽤“传址”⽅式的例⼦。
题⽬是:写⼀函数,实现将两个整型变量的值互换。
幸好实现它也⾮常的简单和直观。典型的⽅法是使⽤“第三者”你可能感到不解:交换两个变量的值,就让这两个变量⾃个互换就得了,⽐如⼩明有个苹果,⼩光有个梨⼦,两⼈你给我给你就好了啊,要⼩兵来做什么?
呵,你看吧:
int a = 1, b = 2;
//不要“第三者”的交换(失败)
a = b;
b = a;
好好看看,好好想想吧。当执⾏交换的第⼀句:a = b;时,看去⼯作得不错,a的值确实由1变成了2。然后再下去呢?等轮到b想要得到a 的值时,a现在和b其实相等,都是2,结果b=a;后,b的值还是2.没变。
只好让“第三者”插⾜了……反正程序没有婚姻法。
int a = 1, b =2;
int c ; //“第三者”
//交换开始:
c = a;
a = b;
b = c;
当⼀个应⽤程序被启动执⾏时,操作系统会给该程序分配⼀块内存空间,⽤于存放该程序运⾏过程中的数据,包括程序本⾝的执⾏代码、程序中定义的各种常量、变量等。
该内存可分为四个区域:程序代码区、全局数据区、堆和栈。
程序代码区
存放函数编译成的⼆进制代码
全局数据区
存放定义的全局变量以及函数体中定义的静态变量
堆
是由程序⽀配的内存空间。在程序运⾏的初期,堆是⼀块空闲的区域,在程序运⾏过程中,可以⽤new在堆中动态申请空间,当⽤完了所申请的空间以后,就可以⽤delete释放这⼀块堆空间,然后这块空间就可以被重新利⽤了
栈
由系统使⽤的动态空间,在进⾏函数调⽤时,系统使⽤栈来存放传递给被调⽤函数的信息,并且在栈中为被调⽤函数的局部变量分配空间。当被调⽤函数执⾏结束时,为调⽤这个函数所分配的所有空间就会被系统⾃动释放。
函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引⽤”,因为该内存在函数体结束时被⾃动销毁。
给⼀个简单的函数
int fn(int a);
ing fn(a){
int ntmp;
ntmp=a+1;
return ntmp;
}
ntmp不是指向“栈内存”的“指针”或者“引⽤”
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论