Lesson21 PoEdu培训第二课 C语言篇(13) 函数
文章类别: 培训笔记 0 评论

Lesson21 PoEdu培训第二课 C语言篇(13) 函数

文章类别: 培训笔记 0 评论

函数

C语言

函数是我们C语言中重要的组成部分.
C语言是过程式编程语言.
过程, 指的就是将程序的执行过程一步一步的分解成一个一个的函数.
好处:

  1. 方便我们进行工程管理
  2. 能够方便我们多次调用, 节约我们的经历.
    将我们经常使用的代码抽象/封装到我们的函数中, 提高我们的复用效率.

函数的组成

函数必须先声明, 后使用.

包含返回类型, 函数名称, 函数参数, 函数体
返回类型

如果我们的函数没有返回值, 我们的返回类型使用void.
函数名称
在C语言中, 函数名称唯一的, 不能改重复.

函数参数

参数可以有多个.

函数体

函数的执行过程中的所有语句的组合, 叫函数体.
return语句, 在有返回值的时候, 必须返回一个与返回类型相同类型的数据.

参数的传递

每个函数都有自己独有的栈帧.
函数是不能修改其他函数的栈帧的, 只能进行只读访问.
所以一般的, 我们的函数参数的传递是传值方式, 即对我们的变量值进行了一个拷贝
当然我们传递变量指针的话, 就是另外一回事了.
当我们的函数执行完成之后, 我们函数的栈帧会被释放掉.

通过反汇编代码, 我们来分析下函数参数的传递过程

我们都知道, 函数调用是使用 call 指令来跳转调用的.
在我们 call 之前, 我们会将被调用的函数所需要的参数入栈, 也就是 push 指令.
在 push 完成我们的参数之后, 我们 jmp 进入新函数
此时, 新函数的栈帧已经生成, 而在我们进行参数的使用的时候

首先需要在VS的反汇编窗口取消"显示符号名"(右键有菜单)这个选项.
我们可以看到, 其实参数的传递是通过 ebp 这个寄存器加上一个数(这个数, 是根据参数类型的大小等进行计算出来的)来进行获取的.

当前, 我们使用的汇编指令为 mov.
但是当我们使用传址的方式来进行参数传递的时候, 我们就不再是使用mov指令, 而是使用 lea 指令.
这个 lea 指令就是用来传递地址的.
参数的传递是从右至左传递的

// 我们在传递普通类型的时候, 都是如下声明并传递的
int add(int first, int second) {
    return first + second;
}
// 而当我们使用传址方式时, 就要写成如下方式
int addNum(int* first, int* second) {
    return *first + *second;
}
// 那么我们在调用的时候就需要如下方式
int main () {
    int first = 1, second = 2;
    add(first, second);
    addNum(&first, &second);
    return 0;
}

如有错误,请提出指正!谢谢.

回复