内容简介:函数是存放在内存的代码区域内由于虚函数是偏移量,所以取得的只是一个索引,即在虚函数表的偏移地址非虚函数,返回的是在内存中的真实地址
函数指针
函数是存放在内存的代码区域内
栗子
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
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java编程思想
埃克尔 / 机械工业出版社 / 2007-5-1 / 79.00元
《Java编程思想(英文版•第4版)》内容简介:特色:1.适合初学者与专业人员的经典的面向对象的叙述方式;为更新的Java SE5/6的相关内容增加了新的示例和章节。2.测验框架显示程序输出。3.设计模式贯穿于众多示例中:适配器、桥接器、职责链、命令、装饰器、外观、工厂方法、享元、点名、数据传输对象、空对象、代理、单例、状态、策略、模板方法以及访问者。4.为数据传输引入了XML;为用户界面引入了S......一起来看看 《Java编程思想》 这本书的介绍吧!