搜索
bottom↓
回复: 6

请教一个函数指针知识

[复制链接]

出0入0汤圆

发表于 2014-7-10 22:12:12 | 显示全部楼层 |阅读模式
typedef void (*function)(void);
//这么理解 void是一种没有形参和没有返回值的一类函数
//用function函数指针变量代替?
#define Function(address)   (*(function)address)()
//先将address强制转换为function类型(函数指针变量)
//(*(function)address)便可以看作一个函数名了,最后用Function(address)代替这个函数名
是不是这么理解呢?对于这个Function(address)宏定义不是很理解,这个Function()括号里面是填函数名吗?还是变量名也行

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入264汤圆

发表于 2014-7-10 22:55:44 | 显示全部楼层
填地址,一般是常量地址。当然也可以是函数名。

出0入0汤圆

发表于 2014-7-10 22:59:52 | 显示全部楼层
本帖最后由 qiao_zlj 于 2014-7-10 23:01 编辑

#define Function(address)   (*(function)address)()
第一次见这么用~感觉好像是对的~
但是这么用感觉不好~容易有歧义~
address必须是地址(函数名),

下面是以前用过的一个函数指针的例子:
struct STRING_ITEM{
    char str[10];
    unsigned short  color;
};

struct MENU_ITEM{
    struct STRING_ITEM message;
    void (*key_func)(unsigned char);
    struct STRING_ITEM *element;
    struct STRING_ITEM *value;
};

static void ch1_menu_key_func(unsigned char code)
{
    switch(code)
    {
        case KEY_SEL1:
                if(ch_couple_get(CH1_COUPLE) == AC_COUPLING)
                {
                    sprintf(ch1_e_value[0].str,"直流");
                    ch_couple_set(CH1_COUPLE,DC_COUPLING);
                }
                else
                {
                    sprintf(ch1_e_value[0].str,"交流");
                    ch_couple_set(CH1_COUPLE,AC_COUPLING);
                }
                break;
        case KEY_SEL2:
                break;
        case KEY_SEL3:
                break;
        case KEY_SEL4:
                break;
        case KEY_SEL5:break;
        default:break;
    }
}

struct MENU_ITEM ch1_menu = {
    {"CH1",CH1_COULOR},//struct STRING_ITEM message;
    ch1_menu_key_func,//void (*key_func)(unsigned char);
    &ch1_ele,//struct STRING_ITEM *ele;
    &ch1_e_value//struct STRING_ITEM *e_value;
};

current_menu->key_func(key_code);//这是那个函数的调用方式
//如果这么用
//typedef void (*function)(unsigned char);
//结构体里可以写成
//function key_func;
//这里的function表示所定义的函数指针的形参与返回值的组成方式

出0入0汤圆

 楼主| 发表于 2014-7-10 23:24:45 | 显示全部楼层
mcu_lover 发表于 2014-7-10 22:55
填地址,一般是常量地址。当然也可以是函数名。

那么这儿Function(常量),这样是代表Function指向这个常量?

出0入264汤圆

发表于 2014-7-11 00:36:14 | 显示全部楼层
ruan18278816371 发表于 2014-7-10 23:24
那么这儿Function(常量),这样是代表Function指向这个常量?

汇编里面:

定义一个函数,假设地址在0x0100处。
XXX表示汇编代码
0x0100 :   XXX
               XXX
               XXX

C里面
(Function)(0x0100) ,编译器会生成跳转语句,跳转到0x0100处执行。实际情况中,会根据你强制转换的函数的类型,如是否带形参。以及编译器对形参的传递是采用栈还是寄存器等方式,生成额外的一些汇编代码。
但最终一定会有一条跳转语句,跳转到0x0100处执行。

你有没有汇编语言的学习经历?学习下,对于理解C会更上层楼。
               

出0入0汤圆

发表于 2014-7-11 01:07:38 | 显示全部楼层
mcu_lover 发表于 2014-7-11 00:36
汇编里面:

定义一个函数,假设地址在0x0100处。

ORG伪指令?

出0入0汤圆

 楼主| 发表于 2014-7-11 12:45:59 | 显示全部楼层
mcu_lover 发表于 2014-7-11 00:36
汇编里面:

定义一个函数,假设地址在0x0100处。

就在微机教材上见过汇编,不懂汇编
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-1 18:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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