C语言函数

1. 函数作用

开发和维护一个大型程序最佳方法就是从一些小的程序片段开始构建它,一个程序片段更容易管理。

C语言中,函数也是子程序,用来模块化程序,完成某项指定任务。

2. 函数分类

函数可分为库函数和自定义函数。库函数是由C标准库中提供的函数,直接使用;自定义函数是我们自己编写的可以完成某个特定功能的函数。

3. 函数

函数是通过函数调用语句而被调用执行的。一个函数可以被调用,也可以调用其他函数,甚至可以在没有任何函数返回时调用其他函数。

3.1函数参数

函数参数可分为两类,一类是实参(实际参数):调用函数真实传递给被调函数的参数,可以是常量、变量、函数、表达式等形式;
另一类是形参(形式参数):函数名后括号中的参数(需要表明接收参数的数据类型)。

3.2函数定义

函数定义格式:
返回值类型 函数名 (形参列表)
{
执行语句;
}
其中,返回值类型是返回给主调函数运算结果的数据类型,可以是void型,表示函数不返回任何值;形参也可以是void型,表示函数调用时不用接收任何值。

3.2.1 被调函数返回值

函数返回形式:从被调函数中返回有三种方式:
(1)函数不需要返回值,在执行到函数最后的右侧花括号时,将自动返回;
(2)函数不需要返回值,或者可以执行语句return;
(3)函数需要一个返回值,语句return 表达式;将表达式的值返回给主调函数。

3.2.2 main函数返回

main函数的返回类型是int,main函数的返回值用来表示函数是否正确地执行结束。早期的C语言版本中,显式地将return 0;写在main函数的末尾——0表示程序成功运行结束,现行的C标准指出,若是忽略语句return 0;,程序隐式地返回0。

4. 函数调用栈帧活动

需要了解的数据结构(计算机内存被划分为栈区、堆区、静态区)。可以将栈想象成一摞盘子,通常放盘子时,将其放在一摞最上边,相当于将盘子压入栈;取盘子时,从最上边取出,相当于盘子弹出栈。因此栈是一种先进后出的数据结构。
每当一个函数调用另外一个函数,就会将一个被称为“栈帧”的实体压栈,这个实体包含调用函数的返回地址(也就是调用函数的下一行指令地址),指明了被调函数返回后主调函数将会从哪个位置继续执行程序。

4.1 举例说明

函数调用栈帧活动以一个sum函数为例,简单说明函数调用的栈帧活动:

int sum(int x,int y)
{
	return x + y;
}
int main()
{
	int a = 10;
	int b = 20;
	int ret = sum(a,b);
	return 0;
}

(1)当执行main函数,将main函数的栈帧压栈
在这里插入图片描述
图1 main函数的栈帧
(2)形参压栈(参数从右向左进行压栈),如图2:
在这里插入图片描述
图2 函数形参压栈
(3)将执行下一行语句的指令地址压栈(执行完sum函数后需要知道从哪一行继续执行),如图3:
在这里插入图片描述
图3 主调函数的下一行指令地址入栈
(4)进入sum函数,首先是将main函数栈帧的栈底地址压栈,再给sum函数开辟栈帧空间,如图4:
在这里插入图片描述
图4 进入sum函数
(5)执行语句x+y,并由寄存器eax将返回值带出,开始出栈,将执行sum函数的内存交还给操作系统。

4.2 总结

  • 当程序调用一个函数时,被调函数必须知道如何返回主调函数。所以主调函数的返回地址必须压入程序执行栈。如果发生了一系列的函数调用,其对应的一组返回地址将按照后进先出的顺序被压入栈,最后被调用的函数将最先返回到它的主调函数。
  • 程序执行过程中,每次函数调用都会产生一些局部变量,所以程序执行栈包含了为局部变量设置的存储区。这些数据被称为函数调用的栈帧。当发生一次函数调用时,它的堆栈帧压栈。当函数返回到主调函数后,它的栈帧将被弹出,那些局部变量将不能再被程序所访问。
  • 由于计算机中的内存容量是有限的,所以程序执行栈中用来保存活动记录的存储单元的总数有一个上限。如果连续发生的多次函数调用产生的活动记录超过了这一上限,将会发生堆栈溢出错误。所以有些程序编译时完全正确,但运行时会因堆栈溢出而失败。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值