内容简介:函数是存放在内存的代码区域内由于虚函数是偏移量,所以取得的只是一个索引,即在虚函数表的偏移地址非虚函数,返回的是在内存中的真实地址
函数指针
函数是存放在内存的代码区域内
栗子
int test(int a){ return a; } int main(int argc, const char * argv[]){ // 这里定义了一个参数为int类型的函数,函数的返回值为int类型的指针fp int (*fp)(int a); // 将test函数的地址赋值给指针fp,完成一个指向函数。该指针指向的函数的参数为int类型 fp = test; // 调用test函数,这里返回的值为2 cout << fp(2) << endl; return 0; }
使用typedef
int test(int a){ return a; } int main(int argc, const char* argv[]){ // 定义一个指向函数的类型 typedef int (*fp)(int a); // 定义了一个指向函数类型的变量f fp f = test; // 进行调用 cout << f(2) << endl; return 0; }
函数指针作为参数传递给函数
int test(int a){ return a - 1; } // (*fun)(int) 定义了一个int类型返回值也为int类型的函数指针fun int test2(int (*fun)(int), int b){ // 这里调用fun指针指向的函数,其传入的参数为10 int c = fun(10) + b; } int main(int argc, const char * argv[]){ // 定义函数指针 typedef int (*fp)(int a); fp f = test; // 调用test2的时候,由于指针f指向test函数的地址,将tets函数的地址作为参数传递给test2,然后tets2再次调用test并传入值为10 cout << test2(f, 1) << endl; }
指向函数的指针数组
void t1(){ cout << "test1" << endl; } void t2(){ cout << "test2" << endl; } void t3(){ cout << "test3" << endl; } int main(int argc, const char * argv[]){ // 定义一个参数为空的函数指针 typedef void (*fp)(void) // 定义一个指向函数的指针数组 fp b[] = {t1, t2, t3}; // 这时通过数组下标,间接的调用 b[0](); }
指向类成员函数的函数指针
由于虚函数是偏移量,所以取得的只是一个索引,即在虚函数表的偏移地址
非虚函数,返回的是在内存中的真实地址
普通函数指针保存的是函数体开始的地址,即,代码指针。
数据指针 用于保存数据的指针
由于虚函数的存在,所以在在类的成员函数指针在调用的时候需要传入类的实例化后的对象,用于找到虚函数在内存中的函数体开始的地址。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- python(函数指针和类函数指针)
- 将数组和矩阵传递给函数,作为C中指针的指针和指针
- flag 中的 Go 函数指针
- CGO 中传递回调函数和指针
- GOLAMG-5 type 不同于C/C++ typedef,切片底层是指针域的函数指针
- Java 8函数式编程模式:不要使用空指针null
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Spring Cloud微服务实战
翟永超 / 电子工业出版社 / 2017-5 / 89
《Spring Cloud微服务实战》从时下流行的微服务架构概念出发,详细介绍了Spring Cloud针对微服务架构中几大核心要素的解决方案和基础组件。对于各个组件的介绍,《Spring Cloud微服务实战》主要以示例与源码结合的方式来帮助读者更好地理解这些组件的使用方法以及运行原理。同时,在介绍的过程中,还包含了作者在实践中所遇到的一些问题和解决思路,可供读者在实践中作为参考。 《Sp......一起来看看 《Spring Cloud微服务实战》 这本书的介绍吧!