C++函数调用
来源:互联网 发布:知乎品牌开放日 编辑:程序博客网 时间:2024/06/06 02:00
1. 函数堆栈
函数堆栈使用的是程序堆栈段内存空间,程序堆栈段属于系统为程序分配的静态存储区。但是函数堆栈是在函数运行时动态分配的。因为没有运行之前无法确定需要多大的堆栈,并且一直占用堆栈空间会导致内存空间耗尽。
函数堆栈的三个用途:
a)进入函数前保存返回地址和环境变量;
b)进入函数时保存实参的拷贝;
c)在函数体内保存局部变量。
2. 函数调用规范
__cdecl 从右 往左调用 函数有利于传递可变参数 __stdcall从右往左被调用函数当可变参数时转位__cdecl_thiscallthis指针直接保存在ECX寄存器被调用函数C++非静态成员函数调用规范,不能使用个数可变参数。__fastcall函数实参直接传递到CPU寄存器被调用函数不能用于成员函数
3. 函数指针
普通函数和类静态成员函数可以不用&取函数地址,而类virtual和普通成员函数需要加&。
<以下为转载 http://blog.sina.com.cn/s/blog_4c4bb565010008mh.html>
右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。 现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深: int (*func)(int *p);首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。int (*func)(int *p, int (*f)(int*));func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。int (*func[5])(int *p);func右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的,而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。int (*(*func)[5])(int *p);func被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。int (*(*func)(int *p))[5];func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。要注意有些复杂指针声明是非法的,例如:int func(void) [5];func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。int func[5](void);func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。
0 0
- 调用C函数
- C调用汇编函数
- C函数调用机制
- C 函数调用测试
- Lua调用C函数
- C函数调用约定
- C++调用c函数
- c调用C++函数
- C函数调用方法
- lua 调用c函数
- C++调用C函数
- C++调用C函数
- C函数调用机制
- Python 调用 C函数
- C++调用C函数
- C函数调用
- c 函数调用方式
- C函数调用过程
- HashMap、TreeMap对象的遍历
- 写给准备参加秋招的学弟学妹们
- 啊水题 Uva10167
- 6.3.3二叉树重建
- 回调函数
- C++函数调用
- Java与C#间json日期格式互转完美解决方案
- linux安全
- javascript中 Date的构造函数 传入规定外的参数的返回值是Invalid Date
- Android SQLite简介
- 找工作开启学霸模式
- 初识Lua——OpenWrt路由界面配置
- Ubuntu Android, JDK环境变量配置
- LeetCode-Unique Paths II