20
社区成员
发帖
与我相关
我的任务
分享在 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 等价 |
[] 数组 > () 函数 > * 指针。(完)