当前位置: 首页 > news >正文

C/C++ 基础笔记(五)

本篇核心知识:指针数组与数组指针、复杂类型分析、const 与指针、运算符优先级 / 结合性、数组定义与指针访问、C 与 C++ const 差异


一、运算符优先级与结合性

概念

优先级决定表达式运算顺序,结合性决定同级运算执行方向,直接影响指针、数组表达式的正确性。

特性

  1. 优先级排序()>[]>*> 算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符

  2. 结合性

    • ()[]:左结合

    • *&const:右结合

  3. 影响:忽视规则会导致数组元素访问、指针解引用错误,是解题高频易错点。

代码示例

int arr[5] = {1,2,3,4,5}; int *p = arr; // 优先级:[] > * → *(p+2) 等价于 p[2],正确访问元素 cout << *(p+2) << endl; // 输出3

相似概念比较:优先级 vs 结合性

  • 优先级:决定谁先算,高优先级先执行。

  • 结合性:优先级相同时,决定从哪边算(左→右 / 右→左)。


二、数组定义、初始化与指针访问

概念

数组是相同类型数据的有序集合,指针可直接操作数组地址,实现灵活访问。

特性

  1. 数组定义类型 数组名[长度],长度为整型常量,不可用变量。

  2. 数组初始化

    • 完整初始化:int arr[5] = {1,2,3,4,5}

    • 省略长度:int arr[] = {1,2,3}(自动匹配元素个数)

    • 部分初始化:剩余元素默认补 0

  3. 指针访问数组

    • 数组名 = 首元素地址(常量指针,不可修改)

    • 等价访问:arr[i] == *(arr+i) == *(p+i)(p 为指向数组的指针)

  4. 数组名本质const指针(*const类型),可访问修改元素,不可赋值、自增自减。

代码示例

// 定义并初始化数组 int arr[5] = {10,20,30,40,50}; // 指针指向数组首元素 int *p = arr; // 指针访问元素 cout << p[1] << endl; // 20 cout << *(p+3) << endl; // 40 // 错误:数组名不可修改 // arr = nullptr;

三、指针数组 vs 数组指针(必考)

概念

指针数组是存指针的数组,数组指针是指向整个数组的指针,核心区别靠括号区分。

特性

1. 指针数组
  • 定义:类型 *数组名[长度]

  • 本质:数组,元素为指针

  • 访问:数组名[i](指针)、*数组名[i](指向的值)

2. 数组指针
  • 定义:类型 (*指针名)[长度]

  • 本质:指针,指向一个完整数组

  • 访问:(*指针名)[i](数组元素)

  • 特性:指针 + 1 跳过整个数组长度(数组指针特有)

代码示例

// 1. 指针数组:5个int*指针 int *pArr[5]; int a = 1, b = 2; pArr[0] = &a; pArr[1] = &b; cout << *pArr[0] << endl; // 1 ​ // 2. 数组指针:指向int[5]数组 int arr[5] = {1,2,3,4,5}; int (*p)[5] = &arr; cout << (*p)[2] << endl; // 3

相似概念比较:指针数组 vs 数组指针

  • 指针数组:数组,元素是指针,[]优先级高于*

  • 数组指针:指针,指向数组,括号改变优先级,()>[]


四、复杂类型分析(做题必考)

概念

拆解多层指针、数组嵌套类型,确定变量本质、指向类型及内存大小。

特性

  1. 核心规则:去掉变量名,剩余部分即类型;优先级()>[]>*

  2. 拆解方法:

    • 数组:从外到内逐层降维

    • 指针:逐个解引用,直到基础类型(int/char)

  3. 大小判断:指针占 4/8 字节;数组大小 = 元素个数 × 单个元素字节数。

代码示例

// 类型:指向int[2][3]的指针 int (*p)[2][3]; cout << sizeof(p) << endl; // 8字节(指针大小) cout << sizeof(*p) << endl; // 24字节(int[2][3]) cout << sizeof(**p) << endl; // 12字节(int[3]) cout << sizeof(***p) << endl; // 4字节(int)

五、const 与指针(超级重点)

概念

const修饰指针,限制指针指向或指向内容的修改,分三种核心类型,C 与 C++ 规则有差异。

特性

1. const 基础
  • 作用:修饰变量,使其只读定义必须初始化,值后续不能修改

  • 等价写法:const int a=int const a

2. const 指针三种形式

指向常量的指针const int *p/int const *p

  • 含义:不能通过 p 修改指向的值,指针指向可改

  • 用途:保护被指向数据

指针常量int *const p

  • 含义:指针指向不可改,指向的值可改

  • 用途:固定指针指向

  • 注释:int型指针不能指向const int型数据地址、const int型指针可以指向int型数据,但不能解析指针修改值

指向常量的指针常量const int *const p

  • 含义:指针指向、指向的值均不可改,完全只读

3. C vs C++ 差异
  • C++:严格类型匹配,普通指针不能指向 const 变量(编译报错)

  • C:允许隐式转换,普通指针可指向 const 变量(不安全)

4. 变量初始化要求
  • C++ 中const变量 / 指针必须初始化,否则无默认值,无法使用。

代码示例

int a = 10, b = 20; // 1. 指向常量的指针 const int *p1 = &a; // *p1 = 100; // 错误:不能修改值 p1 = &b; // 正确:可改指向 ​ // 2. 指针常量 int *const p2 = &a; *p2 = 100; // 正确:可改值 // p2 = &b; // 错误:不能改指向 ​ // 3. 指向常量的指针常量 const int *const p3 = &a; // *p3 = 200; // 错误 // p3 = &b; // 错误

相似概念比较:三种 const 指针

  • const int *p:值只读,指向可变(保护数据)。

  • int *const p:指向只读,值可变(固定地址)。

  • const int *const p:全只读(最严格)。


六、数组复制与修改权限

概念

数组作为特殊变量,复制和修改受常量属性限制,本质为常量指针。即int * const类型,指向int,指向的数据可修改,自己不能被修改

特性

  1. 复制:数组整体不可直接赋值复制,需遍历元素或用内存函数。

  2. 修改:数组名是const指针,不可修改自身地址,但可修改数组内元素值。

  3. 权限本质:数组具有只读地址、读写元素的权限。

代码示例

int arr1[3] = {1,2,3}; int arr2[3]; // 错误:数组不可直接赋值复制 // arr2 = arr1; // 正确:遍历复制元素 for(int i=0; i<3; i++) arr2[i] = arr1[i]; // 正确:修改元素值 arr1[0] = 10;
http://www.zskr.cn/news/1449740.html

相关文章:

  • SQL学习日志 Day_3 :(SELECT查询语句入门)
  • JWT令牌在多端跨域场景下的安全访问校验实践
  • mpv.net 终极指南:Windows平台高性能媒体播放器完整配置与实战技巧
  • IDEA装了LiteFlowX插件后,我写规则文件再也没翻过文档(智能提示+跳转真香)
  • 如何5分钟搭建个人音乐库:洛雪音乐聚合音源终极指南
  • 别再只看风速了!固定翼新手选飞行天气,这3个APP和2个关键数据更重要
  • IPXWrapper完整指南:让Windows 10/11完美运行经典游戏联机
  • 鸣潮模组终极指南:15+功能解锁,彻底改变你的游戏体验
  • 电路设计入门:从元器件到实战项目,零基础掌握电子制作核心技能
  • OmenSuperHub完整指南:解锁惠普游戏本隐藏性能的终极工具
  • 【浏览器智能体】Browser Use 与现有 pytest-bdd 框架的深度整合方案
  • Unity游戏开发避坑:用.NET 4.x和System.Data.SqlClient搞定SQL Server 2022连接(保姆级教程)
  • 从卓晴到稚晖君:盘点那些硬核技术大佬的“神仙”个人实验室
  • 告别手动画框!用SurgicalSAM实现手术器械的“一句话分割”:从类提示到精准掩码的保姆级解析
  • JetBrains IDE试用期重置终极教程:简单快速恢复30天免费使用
  • 别只敲命令了!用Shell脚本把openEuler日常操作自动化(附5个实用脚本)
  • 从HUSTOJ迁移到Hydro OJ:一个老牌OJ维护者的踩坑与平滑升级指南
  • 告别WPS看图!用这个免费插件让Windows 10/11文件夹直接预览SVG图片
  • 大麦网演唱会抢票神器:Python自动化脚本告别黄牛高价票
  • 中牟沙发翻新换皮换布哪家好、匠阁、御匠、锦修三大品牌哪个靠谱公司推荐、怎么选沙发翻新服务商 - 卓一科技
  • 荥阳沙发翻新换皮换布哪家好、匠阁、御匠、锦修三大品牌哪个靠谱公司推荐、怎么选沙发翻新服务商 - 卓一科技
  • Streamlit开发LLM应用时,关于`st.session_state`和页面重渲染的3个关键陷阱
  • 2026年CAD转PDF完全教程:批量转换方法与AutoCAD导出详细步骤一看就会
  • 昆山装修公司设计师怎么选:从业年限与落地能力的判断逻辑 - 资讯焦点
  • 超越KITTI文档:深度拆解calib.txt,揭秘多相机标定数据在自动驾驶仿真中的真实用法
  • 保姆级避坑指南:Ubuntu 18.04上ROS Melodic安装全流程(含国内源与rosdep更新终极方案)
  • Android TV Leanback高级开发实战指南:架构设计与交互模式深度解析
  • YOLOv8模型在RK3588上部署的实战避坑:从ONNX导出到RKNN转换的关键步骤详解
  • 移动电源DIY改造:从IP5305电路分析到18650电池扩容实战
  • 技术文档可视化革命:Mermaid Live Editor如何重塑团队协作效率