ruan18278816371 发表于 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()括号里面是填函数名吗?还是变量名也行

mcu_lover 发表于 2014-7-10 22:55:44

填地址,一般是常量地址。当然也可以是函数名。

qiao_zlj 发表于 2014-7-10 22:59:52

本帖最后由 qiao_zlj 于 2014-7-10 23:01 编辑

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

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

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.str,"直流");
                  ch_couple_set(CH1_COUPLE,DC_COUPLING);
                }
                else
                {
                  sprintf(ch1_e_value.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表示所定义的函数指针的形参与返回值的组成方式

ruan18278816371 发表于 2014-7-10 23:24:45

mcu_lover 发表于 2014-7-10 22:55
填地址,一般是常量地址。当然也可以是函数名。

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

mcu_lover 发表于 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会更上层楼。
               

笑笑我笑了 发表于 2014-7-11 01:07:38

mcu_lover 发表于 2014-7-11 00:36
汇编里面:

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


ORG伪指令?

ruan18278816371 发表于 2014-7-11 12:45:59

mcu_lover 发表于 2014-7-11 00:36
汇编里面:

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


就在微机教材上见过汇编,不懂汇编{:sad:}
页: [1]
查看完整版本: 请教一个函数指针知识