循环
C语言种有三种循环:
do...while
while
for(初始化;条件判断;步进)
函数
主函数(main)
库函数
自定义函数
函数的发明,使得变成可以以函数为单位进行模块化,叫做面向过程。
函数的调用过程
软件工程中,有“高内聚,低耦合”的要求。 函数就是为了实现以上要求发明的产物。 函数是面向过程的“接口",其接口包含了:参数、返回值。 函数与函数之间,就是通过参数、返回值进行交互的。并且,因为低耦合的设计,函数与函数之间,互相不需要直到对方内部的实现。具体而言,函数调用过程,会从传参开始,到获取函数调用的返回值结束。
函数是通过栈来存储交互信息(包括参数、局部变量、返回地址):
栈其实就是一块内存区域,一般而言(纯经验),VS系列,栈的地址为0x0018xxxx或0x0019xxxx。 代码区域,以0x0040xxxx, 0x00041xxxx开头。
具体的传参细节要复杂得多,包括:
1. 按照调用约定传参
2. 保存返回地址
3. 跳转到被调用的函数(转移流程)
4. 保存上一层函数的栈地址
5. 开辟局部变量空间
6. 保存程序环境
7. 开始执行被调用函数的代码
函数的返回
函数的返回,从最顶部的栈帧开始(较低地址),逐渐往高地址的栈帧转移。每返回一层函数,它对应的栈帧就“丢弃”。
1. 恢复寄存器环境
2. 放弃栈帧空间(也成为“平衡栈”)
3. 取返回地址并跳转到该地址
还剩最后一个问题,返回值到底是如何返回的?答: 在x86中,函数的返回值放在寄存器eax中。
传参约定
传参约定到底约定了什么?
答:传参的顺序、用什么传参、谁平衡栈
1、标准约定,__stdcall
1. 从右往左依次传参
2. 使用栈传参
3. 被调用方平衡栈
2、C约定, __cdecl
1. 从右往左依次传参
2. 使用栈传参
3. 调用方平衡栈
问:printf的传参约定是什么?为什么?
C约定,因为printf是变参函数,变参函数传参的个数是变化的,只能调用方去平衡栈。
本文详细介绍了C语言中的函数调用过程,包括循环、函数的概念,重点解析了函数调用的过程,如传参约定、栈的使用、返回值的处理,并探讨了函数的返回机制。同时,提到了不同类型的传参约定,如__stdcall和__cdecl,以及变参函数printf的传参特点。

7417

被折叠的 条评论
为什么被折叠?



