You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:18:16