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

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

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

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

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

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

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


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

查看所有标签

猜你喜欢:

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

数据分析技术白皮书

数据分析技术白皮书

伍海凤、刘鹏、杨佳静、马师慧Sara、李博、Shirley Song、Zinc、李晓艳 / 2016-8-11 / 0

关于数据分析技术白皮书(Analytics Book 中文版),主要内容围绕: 1. 分析(Analytics):网站分析 & APP分析 2. 谷歌分析工具的原理、部署与使用 3. 开源网站分析工具的原理、部署与使用 4. Log日志分析原理 5. 网站分析的维度与指标定义 6. 如何炼成为一个互联网数据分析师 请访问书的数据分析技术白皮书官网“免费”阅......一起来看看 《数据分析技术白皮书》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具