c语言中规定函数的返回值的类型是由在定义该函数时所指定的函数类型所决定的。
函数返回值,顾名思义,就是函数运行完毕后,返回给调用者的值。
就目前来看,关于函数返回值,我们只学过以下四种:
∙返回值为void返回值为数值,如int
∙返回值类型为指针,如int*
∙返回值类型为引用,如int&
先说一下函数的运行过程,以返回值类型为int进行说明,代码如下:
int f()
{
int a = 1;
return a;
}
int main(void)
{
f();
return 0;
}
在函数调用过程中,有主调函数和被掉函数之分,在上面的代码中,f函数属于被调函数,main函数属于主调函数。
一般来讲,返回值是返回给主调函数的,在上面的代码中,f函数的返回值返回给了main函数,只不过在这里,main函数并没有利用f函数的返回值。
在函数执行接近末尾的时候,以上面的f函数为例,当执行到return a;的时候,编译器一般会这样做:
int main(void)
{
f();
return 0;
}
在函数调用过程中,有主调函数和被掉函数之分,在上面的代码中,f函数属于被调函数,main函数属于主调函数。
一般来讲,返回值是返回给主调函数的,在上面的代码中,f函数的返回值返回给了main函数,只不过在这里,main函数并没有利用f函数的返回值。
在函数执行接近末尾的时候,以上面的f函数为例,当执行到return a;的时候,编译器一般会这样做:
开辟一个int大小的内存空间,用a的值(这里是1)将其初始化。
在f函数执行完毕后,其返回值所占的那块内存空间仍然存在,不会随着函数执行完毕而被销毁。
返回值为void时,被调函数不给主调函数返回值。
返回值类型为int与返回值类型int*,其本质上都是返回一个值,只不过就是类型不一样。
返回值类型为引用的情况有所不同,代码如下:()c语言是啥
int& f()
{
int a = 1;
return a;
}
在这种情况下,编译器不会为返回值开辟内存空间,这个函数返回的变量a的引用,也就是返回了变量a的别名。
这种写法儿,其实是有风险的,为何这么说?因为f函数在执行完毕后,变量a会被销毁,也就是说a那块内存空间不会存在,因此f函数返回的那个引用指向的将会是一块被销毁的空间。
引用作为函数的返回值,函数返回的引用指向的是“外部的变量”,如下所示:
int& f(int &r)
{
return r;
}
在这种情况下,编译器不会为返回值开辟内存空间,这个函数返回的变量a的引用,也就是返回了变量a的别名。
这种写法儿,其实是有风险的,为何这么说?因为f函数在执行完毕后,变量a会被销毁,也就是说a那块内存空间不会存在,因此f函数返回的那个引用指向的将会是一块被销毁的空间。
引用作为函数的返回值,函数返回的引用指向的是“外部的变量”,如下所示:
int& f(int &r)
{
return r;
}
int main(void)
{
int a = 5;
f(a) = 9;
cout << a << endl;
return 0;
}
f函数的形式参数是引用,在f函数运行过程中,r是变量a的别名,同时f函数又返回了r的引用,也就是返回了a的引用,因此通过f(a) = 9;的操作,成功地修改a的值,于是输出9
int main(void)
{
int a = 5;
f(a) = 9;
cout << a << endl;
return 0;
}
f函数的形式参数是引用,在f函数运行过程中,r是变量a的别名,同时f函数又返回了r的引用,也就是返回了a的引用,因此通过f(a) = 9;的操作,成功地修改a的值,于是输出9
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论