栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C/C++ 函数指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C/C++ 函数指针

函数指针

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

栗子
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]();
}
指向类成员函数的函数指针

由于虚函数是偏移量,所以取得的只是一个索引,即在虚函数表的偏移地址
非虚函数,返回的是在内存中的真实地址
普通函数指针保存的是函数体开始的地址,即,代码指针。

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/232424.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号