C - 这个函数指针声明是什么意思?

标签 c arrays

我正在分析一些多线程代码。在一个初始化函数中,有一段代码是这样的:

for(i=0;i<MAX_STREAMS;i++){
    cmdStreamTaskPtr[i] = NULL;
}

我理解该语法,但我的问题出在 cmdStreamTaskPtr 的声明中。它按以下方式定义,其中 cmdData_t 是一个 typedef structMAX_STREAMS 是 5。

static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void) = {[0 ... MAX_STREAMS-1] = NULL};

我不知道这行是什么意思。它是一个有默认值的变量吗?

最佳答案

cmdStreamTaskPtr是一个数组:

cmdStreamTaskPtr[MAX_STREAMS]

指针:

*cmdStreamTaskPtr[MAX_STREAMS]

对于不接受参数的函数:

(*cmdStreamTaskPtr[MAX_STREAMS])(void)

并返回 cmdData_t * :

cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void)

并且是static :

static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void)

然后用 NULL 初始化该数组对于所有数组成员:

static cmdData_t *(*cmdStreamTaskPtr[MAX_STREAMS])(void) = {[0 ... MAX_STREAMS-1] = NULL};

注意初始化语法[0 ... MAX_STREAMS-1] 不是标准 C,而是 GCC 支持的扩展。在这种情况下它也是多余的,因为数组被声明为 static ,这意味着它具有静态存储持续时间,因此它的元素被隐式初始化为 NULL如果没有显式初始化。

使用 typedef 可以使函数指针的使用更加清晰.在这种情况下,我们可以创建以下 typedef:

typedef cmdData_t *(*fp)(void);

这使得 fp指向不带参数并返回 cmdData_t * 的函数指针的 typedef .然后可以将数组定义更改为:

static fp cmdStreamTaskPtr[MAX_STREAMS];

所以现在应该更清楚了cmdStreamTaskPtrfp 的数组, 其中 fp是之前定义的函数指针。

关于C - 这个函数指针声明是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50805713/

相关文章:

c - GCC 对 int *a = {1,2,3,4,5} 的语句做了什么?

c - 这个c代码行有什么问题?

java - 将泛型集合转换为数组

php in_array() 以数组为针产生意外结果

c - 动态数组 C

Python:迭代具有不同维数的列表,有通用的方法吗?

c++ - 命名数组元素,或 union 内的结构和数组

C 以百分比影响随机化

c - 关于标准中的程序启动

javascript - 如何将数组添加到数组位置