数组作为带参数的函数?

时间:2016-12-13 06:34:01

标签: c arrays pointers const function-pointers

我正在尝试学习c,所以我尝试阅读一些源代码 但我不知道这可能意味着什么:

static const char*(*const functab[])(void)={
        ram,date
};

第一部分static const char*很好,因为它似乎是一个函数(有void类型的参数),static应该意味着它只在这个文件中可见而const char*应该意味着价值不能改变,但地址可以改变 但是在这种情况下,在函数名后面的最后一部分之后没有意义,因为它是

的情况。
static const char * date(void);
static const char * ram(void);

而不是函数名称有(*const functab[]),一个名为functab的const数组包含地址?
这是包含函数ram和date的某种包装函数吗?一些声明数组的替代方法?

4 个答案:

答案 0 :(得分:4)

functab是一个函数指针数组(确切地说是const函数指针的数组),它返回const char*并且不接受任何参数。

后来,

 ... = { ram, date };

是一个括号括起的初始化列表,用作数组的初始化器。

答案 1 :(得分:3)

这是在C中定义函数指针数组的方法。因此,不是将函数调用为ram(),而是使用此数组,可以通过(* functab[1])调用它。

下面讨论了函数指针数组的好例子: How can I use an array of function pointers?

答案 2 :(得分:2)

简短回答:这里functab是一个函数指针数组,数组初始化为指向函数ramdate的指针。这也解释了可能来自" FUNCtion TABle"的名称functab。

答案很长:在C语言中,您可以获得指向函数的指针并将其保存到变量中。以这种方式使用的变量称为函数指针。

例如,下面的funcptr变量将包含do_stuff的入口点地址:

int do_stuff(const char* x) { ...do stuff.. }
...
ftype_t funcptr = &do_stuff;
...
(*funcptr)("now");  // calls do_stuff()

仅当您已在此处定义funcptr的{​​{1}}类型时,此功能才有效。类型定义应采用以下形式:

ftype_t

在英语中,这意味着typedef int (*ftype_t)(const char*); 被定义为一种函数,它将ftype_t作为唯一参数并返回const char*

如果你不想int只为了这个,你可以通过以下方式实现同​​样的目标:

typedef

这样可行,但其语法令人困惑。如果您尝试执行诸如构建函数指针数组之类的操作,这也会非常难看。这正是您的代码所做的。

下面显示的是等效代码,更容易理解:

int (*funcptr)(const char*) = &do_stuff; 

(&(地址)通常是可选的,但建议使用。)

答案 3 :(得分:1)

需要在C:

中读出复杂的变量声明
  • functab是变量的标识符,所以我们开始在这里阅读...

  • functab[]这是一个数组...

  • *const functab[]常量指针...

  • (*const functab[])(...)到函数...

  • (*const functab[])(void)不参与......

  • const char*(*const functab[])(void)但返回const char*

static的含义取决于它是在函数的外部还是内部。如果它在外面,static表示functab声明了文件范围(即只在单个.c文件中可见的全局变量)。如果它在函数内部,则意味着functab是一个仅在该函数内可见的全局变量。

= { ram, date }使用两个成员初始化数组。 ramdate都应该是声明为const char* ram(void)的函数。

此声明的效果是,以下函数调用是等效的:

const char* result = ram();
const char* result = functab[0]();