C语言 - 复杂指针与声明语法 - 两条重要原则

Peter_Deng. 2025-08-27 09:42:26

C语言复杂指针声明详解

在 C 语言中,变量声明的语法非常灵活,尤其在涉及指针、数组、函数指针、常量限定符等语法时,常常令人困惑。为了准确理解这些声明,我们只需要掌握两个核心分析原则。

理解复杂声明的两条原则

  1. 除了变量名以外的部分,就是变量名的类型。
  2. 除了 * 和变量名以外的部分,就是“指向对象”的类型。

这两句话可以帮助我们逐步剥离一个复杂声明的结构,弄清楚每一层的含义。

常见复杂声明解析与解释

下面我们通过几个常见声明实例,逐一解析其结构和含义。

int* p;

变量名为 p,类型是 int*,表示 p 是一个指向 int 类型数据的指针。

int* p[10];

变量名是 p,类型是 int* [10],即:p 是一个包含 10 个元素的数组,数组中每个元素是指向 int 的指针。这种类型称为指针数组

int (*p)[10];

变量名是 p,类型是 int (*)[10],即:p 是一个指针,指向一个包含 10 个 int 类型元素的一维数组。这种类型称为数组指针

区别:

  • int* p[10]:数组中的每个元素是指针。
  • int (*p)[10]:指针指向一个整体数组。

int* (*ptr)();

变量名是 ptr,类型是 int *(*)(),表示 ptr 是一个函数指针,指向一个无参数的函数,该函数返回一个 int* 类型的指针。

const int * const p;

这个声明由两个 const 修饰词构成:

  • const int *:指向的 int 值是常量,不能通过指针修改它的值。
  • * const:指针本身是常量,不能再指向别处。

因此 p 是一个常量指针,指向一个常量整数。即:指针和其指向的内容都不能修改。

int (* const* p)();

  • p 是一个指针,指向一个“常量函数指针”。
  • 所指向的函数指针本身是常量(不能改变其指向)。
  • 函数无参数,返回 int 类型。

这种用法常见于函数指针表、回调注册等场景。

int const * const p;

这个写法和 const int * const p 含义完全相同,只是顺序不同,表示:

  • p 是一个常量指针;
  • 指向一个常量整数。

总结表格

声明解释
int* p;指向整数的指针
int* p[10];指针数组:每个元素是 int*
int (*p)[10];数组指针:指向一个含10个元素的 int 数组
int *(*ptr)();函数指针,返回值为 int*
const int * const p;常量指针,指向常量整数
int (* const *p)();指针,指向常量函数指针,函数返回 int
int const * const p;const int * const p 等价

快速判断技巧

  1. 从变量名开始看,结合括号优先级进行分析。
  2. 括号内优先处理:[] 数组 > () 函数 > * 指针。
  3. 类型从右往左读,辅助理解声明含义。
  4. 拆解时多问自己一句:“这是一个什么?”、“它指向什么?”、“它返回什么?”

(完)

...全文
22 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21

社区成员

发帖
与我相关
我的任务
社区管理员
  • c_university_1665
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧