函数参数
函数参数在本质上与局部变量相同在栈上分配空间
函数参数的初始值是函数调用时的实参值
函数参数的求值顺序依赖于编译器的实现
/* 测试代码 */
#include <stdio.h>
int func(int i, int j)
{
printf("%d, %d\n", i, j);
return 0;
}
int main()
{
int k = 1;
func(k++, k++);
return 0;
}
运行结果
2, 1
参数入栈顺序
函数参数的计算次序是依赖编译器实现的,那么函数参数的入栈次序是如何确定的呢?
调用约定
当函数调用发生时
参数会传递给被调用的函数
而返回值会被返回给函数调用者
调用约定描述参数如何传递到栈中以及栈的维护方式
参数传递顺序
调用栈清理
- 调用约定是预定义的可理解为调用协议
- 调用约定通常用于库调用和库开发的时候
- 从右到左依次入栈:_ _ stdcall, _ _ cdecl, _ _thiscall
- 从左到右依次入栈:_ _ pascal , _ _ fastcall