鱼C论坛

 找回密码
 立即注册
查看: 1458|回复: 2

[已解决]指针数组

[复制链接]
发表于 2018-10-25 20:37:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有没有办法在同一个指针数组中存放不同类型的函数指针
最佳答案
2018-10-26 09:51:03
本帖最后由 风扫地 于 2018-10-26 09:58 编辑

1、函数指针也是指针(一个地址值,函数的首地址),一个函数的地址值当然可以强转为一个其他类型的函数指针放在某种类型的函数指针数组里面,然后在调用时的时候再强转为对应的函数指针类型并传入相应参数进行调用(如楼上的代码);
2、你要愿意甚至可以将一个常数强制转换为函数指针(见Ref2),再通过这个函数指针调用对应的程序段,当然你需要保证这个常数地址对应的位置是你可以正常访问和退出的代码段,而对于常数们在统一编址过的32位操作系统你用int32的数组就能存,这种把常数强制转换为函数指针再通过函数指针调用对应代码段的用法在嵌入式平台中用得很多;
3、我很好奇的是,是什么应用的需求促使了你有这个想法,数组本来就是为了存同类型数据的而发明的机制,站在地址的值(value)这一级当然是同一类数据,不过需要自己处理强转和调用的问题,但站在函数指针这一级,如果他们本来就不一样,为什么用把他们弄到一个数组里面来?
4、事实上,存函数指针都不一定需要用函数指针数组,对于楼上的代码,可以尝试下求下 sizeof(arr[0])的值,然后用同长度的其他基础( 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/blo ... 138201301585548729/
5.https://blog.csdn.net/wenhui_/article/details/6791805
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[3])();

        arr[0] = fun1;
        arr[1] = (void(*)())fun2;
        arr[2] = (void(*)())fun3;

        arr[0]();
        arr[1]();
        ((int(*)(int, int))arr[2])(3, 4);
       
        system("pause");

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-10-26 09:51:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风扫地 于 2018-10-26 09:58 编辑

1、函数指针也是指针(一个地址值,函数的首地址),一个函数的地址值当然可以强转为一个其他类型的函数指针放在某种类型的函数指针数组里面,然后在调用时的时候再强转为对应的函数指针类型并传入相应参数进行调用(如楼上的代码);
2、你要愿意甚至可以将一个常数强制转换为函数指针(见Ref2),再通过这个函数指针调用对应的程序段,当然你需要保证这个常数地址对应的位置是你可以正常访问和退出的代码段,而对于常数们在统一编址过的32位操作系统你用int32的数组就能存,这种把常数强制转换为函数指针再通过函数指针调用对应代码段的用法在嵌入式平台中用得很多;
3、我很好奇的是,是什么应用的需求促使了你有这个想法,数组本来就是为了存同类型数据的而发明的机制,站在地址的值(value)这一级当然是同一类数据,不过需要自己处理强转和调用的问题,但站在函数指针这一级,如果他们本来就不一样,为什么用把他们弄到一个数组里面来?
4、事实上,存函数指针都不一定需要用函数指针数组,对于楼上的代码,可以尝试下求下 sizeof(arr[0])的值,然后用同长度的其他基础( 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/blo ... 138201301585548729/
5.https://blog.csdn.net/wenhui_/article/details/6791805
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表