幻风帝影 发表于 2018-10-25 20:37:06

指针数组

有没有办法在同一个指针数组中存放不同类型的函数指针

回访三生 发表于 2018-10-25 22:07:05

刚试了一下, 可以的,贴上个简单的例子来抛砖引玉!

#include<iostream>

using namespace std;

void fun1()
{
        cout << "I am fun1" << endl;
}

int fun2()
{
        cout << "I am fun2" << endl;
        return 0;
}

int fun3(int a, int b)
{
        cout << "I am fun3" << endl;
        cout << a + b << endl;
        return 0;
}

int main()
{
        void (*arr)();

        arr = fun1;
        arr = (void(*)())fun2;
        arr = (void(*)())fun3;

        arr();
        arr();
        ((int(*)(int, int))arr)(3, 4);
       
        system("pause");

        return 0;
}

风扫地 发表于 2018-10-26 09:51:03

本帖最后由 风扫地 于 2018-10-26 09:58 编辑

1、函数指针也是指针(一个地址值,函数的首地址),一个函数的地址值当然可以强转为一个其他类型的函数指针放在某种类型的函数指针数组里面,然后在调用时的时候再强转为对应的函数指针类型并传入相应参数进行调用(如楼上的代码);
2、你要愿意甚至可以将一个常数强制转换为函数指针(见Ref2),再通过这个函数指针调用对应的程序段,当然你需要保证这个常数地址对应的位置是你可以正常访问和退出的代码段,而对于常数们在统一编址过的32位操作系统你用int32的数组就能存,这种把常数强制转换为函数指针再通过函数指针调用对应代码段的用法在嵌入式平台中用得很多;
3、我很好奇的是,是什么应用的需求促使了你有这个想法,数组本来就是为了存同类型数据的而发明的机制,站在地址的值(value)这一级当然是同一类数据,不过需要自己处理强转和调用的问题,但站在函数指针这一级,如果他们本来就不一样,为什么用把他们弄到一个数组里面来?
4、事实上,存函数指针都不一定需要用函数指针数组,对于楼上的代码,可以尝试下求下 sizeof(arr)的值,然后用同长度的其他基础( int或者long)类型的数组来代替存储函数的首地址(即函数名),然后在调用的时候获取数值强转后传入对应参数进行调用。



REF:
1.https://blog.csdn.net/huanhuanxiaoxiao/article/details/79600150
2.https://www.cnblogs.com/yaowen/p/4797354.html
3.https://wenku.baidu.com/view/dcd30d8b6529647d272852df.html
4.http://cooliron.blog.163.com/blog/static/124703138201301585548729/
5.https://blog.csdn.net/wenhui_/article/details/6791805
页: [1]
查看完整版本: 指针数组