C/C++ 函数指针

栏目: C · 发布时间: 7年前

内容简介:函数是存放在内存的代码区域内由于虚函数是偏移量,所以取得的只是一个索引,即在虚函数表的偏移地址非虚函数,返回的是在内存中的真实地址

函数指针

函数是存放在内存的代码区域内

栗子

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]();
}

指向类成员函数的函数指针

由于虚函数是偏移量,所以取得的只是一个索引,即在虚函数表的偏移地址

非虚函数,返回的是在内存中的真实地址

普通函数指针保存的是函数体开始的地址,即,代码指针。

数据指针 用于保存数据的指针

由于虚函数的存在,所以在在类的成员函数指针在调用的时候需要传入类的实例化后的对象,用于找到虚函数在内存中的函数体开始的地址。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

React

React

卓越开发者联盟 / 寸志、范洪春、杨森、陈涌 / 电子工业出版社 / 2015-5-1 / CNY 65.00

2014 年横空出世的由Facebook 推出的开源框架React.js,基于Virtual DOM 重新定义了用户界面的开发方式,彻底革新了大家对前端框架的认识,将PHP 风格的开发方式迁移到客户端应用开发。其优势在于可以与各种类库、框架搭配使用。《React:引领未来的用户界面开发框架》是这一领域的首作,由多位一线专家精心撰写,采用一个全程实例全面介绍和剖析了ReactReact.js 的方方......一起来看看 《React》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码