21
社区成员




在 C 语言中,变量声明的语法非常灵活,尤其在涉及指针、数组、函数指针、常量限定符等语法时,常常令人困惑。为了准确理解这些声明,我们只需要掌握两个核心分析原则。
*
和变量名以外的部分,就是“指向对象”的类型。这两句话可以帮助我们逐步剥离一个复杂声明的结构,弄清楚每一层的含义。
下面我们通过几个常见声明实例,逐一解析其结构和含义。
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 等价 |
[]
数组 > ()
函数 > *
指针。(完)