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

Peter_Deng. Peter_Deng. 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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. 拆解时多问自己一句:“这是一个什么?”、“它指向什么?”、“它返回什么?”

(完)

...全文

相关推荐

C语言所有复杂的指针声明

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:

Elison062

C语言指针总结

指针是C语言中的难点,也是C语言中的精华所在,本文档列举了指针使用中的常见注意事项及易混淆知识点的对比,为C语言的初学者掌握指针提供了清晰的思路。

凤采鸾章

超强的指针学习笔记 C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左 法则其实并不是C标 准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩 识一个声明的,两者可 以说是相反的。右左法则的英文原文是这样说的: The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

feixiangmenghuan

c语言指针,指针与变量,指针与指针

指针变量,指针与数组, 指针与函数, 字符串与指针,指向指针的指针

jena_wy

C语言复杂声明xiaoyi

C语言的声明可以很复杂,这些复杂声明在平时并不常用,但还是有必要解决一下

nianqingtai
评论
收藏 已收藏
分享
返回顶部