C语言中void *ptr[N](int)与void (*ptr)[N](int)的区别及报错问题
C语言中
void *ptr[N](int)与void (*ptr)[N](int)的区别及报错原因 一、void *ptr[N](int)的含义
这是一个合法的函数指针数组声明:
ptr是包含N个元素的数组- 数组内每个元素是函数指针,指向的函数接受一个
int类型参数,返回值为void*
优先级逻辑:[]的优先级高于*,因此先解析ptr[N](ptr是数组),再解析*(数组元素是指针),最后(int)说明该指针指向接受int参数的函数,返回void*类型。
二、void (*ptr)[N](int)的非法性
这个声明违反C语言语法,直接触发报错的原因:
- 按照优先级,
(*ptr)先解析为“ptr是一个指针”,后续[N]表示该指针指向一个包含N个元素的数组 - 但C语言不允许数组的元素是函数——函数属于不可直接存储的对象类型,只能用函数指针作为数组元素。该写法试图定义元素为“接受int参数、返回void的函数”的数组,这是语法不允许的。
你收到的报错信息也明确指出了问题:
..error: declaration of ‘ptr’ as array of functions void (*ptr)3;
编译器将该声明解析为“ptr是指向函数数组的指针”,而函数数组本身就是非法构造,因此报错。
三、void (*ptr[3])(int)合法的原因
这是C语言中标准的函数指针数组声明:
ptr是包含3个元素的数组- 数组内每个元素是函数指针,指向的函数接受一个
int类型参数,返回void
优先级逻辑:[]优先级高于*,先解析ptr[3](ptr是数组),再解析(*ptr[3])(数组元素是指针),最后(int)说明该指针指向接受int参数、返回void的函数。这种写法常用于存储回调函数集合等场景,完全符合C语言语法规范,因此能正常编译运行。
内容的提问来源于stack exchange,提问作者pushpa
相关产品推荐
相关产品推荐

