news 2026/4/23 13:42:06

二维数组指针操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二维数组指针操作

以下是 C++ 中对二维数组指针操作的演示,主要展示了如何通过指针访问二维数组中的元素。我们来逐行讲解其含义和作用。


🧩 假设前提

在看这段代码之前,我们需要知道一些上下文(虽然图中未显示):

通常这种代码出现在如下场景中:

intarr[2][4]={{1,2,3,4},{5,6,7,8}};int(*p2)[4]=arr;// p2 是指向含有 4 个 int 的数组的指针

即:p2是一个指向int[4]类型的指针,也就是指向二维数组的一行。


🔍 逐行解析代码

cout<<"**************"<<endl;

输出一行星号作为分隔符,便于调试输出查看。

cout<<p2<<endl;

打印p2指针本身的值,即第一行数组的首地址(例如:0x7ffeeb3f2a40)。

//取出数组地址cout<<*p2<<endl;

*p2表示解引用p2,得到它所指向的第一个一维数组(即arr[0])的首地址。

注意:此时*p2实际上就是arr[0]的地址,也等于&arr[0][0],所以这个输出和上面的p2可能相同(因为p2*p2在地址上可能一致,但类型不同)。

重点理解:

  • p2int(*)[4]类型 → 指向整个行
  • *p2int[4]类型 → 解引用后是一个数组,但编译器会将其退化为int*(指向第一个元素)
  • 所以*p2等价于&arr[0][0],即arr[0]的首地址
//第二行数组首地址cout<<p2+1<<endl;//偏移元素*容量 16个字节

p2 + 1表示将指针p2向后移动一个int[4]的大小。

因为每个int[4]4 * sizeof(int)= 16 字节(假设int是 4 字节),所以这一步跳过了第一行,指向了第二行的首地址(即arr[1]的地址)。

//取出数组地址//int*cout<<*(p2+1)<<endl;

*(p2 + 1)就是解引用第二行的地址,结果是arr[1]的首地址(即&arr[1][0]),也就是arr[1]数组本身。

cout<<**(p2+1)<<endl;

**(p2 + 1)

  • (p2 + 1)得到第二行的地址
  • *(p2 + 1)得到第二行的首地址(&arr[1][0]
  • 最后再*(*(p2 + 1))就是取该地址的内容 →arr[1][0]的值

所以这里输出的是5(如果数组初始化为{1,2,3,4}, {5,6,7,8}

//先偏移行地址,再在这一行中偏移元素地址cout<<*(*(p2+1)+1)<<endl;cout<<*(*(p2+1)+2)<<endl;cout<<*(*(p2+1)+3)<<endl;

这些语句是在第二行中访问后续元素:

  • *(p2 + 1)→ 第二行首地址(&arr[1][0]
  • *(p2 + 1) + 1→ 指向arr[1][1]的地址
  • *(*(p2 + 1) + 1)→ 获取arr[1][1]的值 →6

同理:

  • *(*(p2 + 1) + 2)arr[1][2]7
  • *(*(p2 + 1) + 3)arr[1][3]8

✅ 总结:关键点

表达式含义示例值(基于arr[2][4] = {{1,2,3,4},{5,6,7,8}}
p2第一行的地址&arr[0]
*p2第一行的首元素地址&arr[0][0]
p2 + 1第二行的地址&arr[1]
*(p2 + 1)第二行的首元素地址&arr[1][0]
**(p2 + 1)第二行第一个元素值5
*(*(p2 + 1) + 1)arr[1][1]6
*(*(p2 + 1) + 2)arr[1][2]7
*(*(p2 + 1) + 3)arr[1][3]8

🎯 核心思想

  • 二维数组本质是一维连续内存的逻辑划分。
  • 使用指针int (*)[n]可以安全地遍历每一行。
  • 多层解引用可以实现类似arr[i][j]的效果。
  • 指针算术中,p2 + 1跳过整行(不是单个元素),这是“数组指针”与“普通指针”的区别。

💡 小技巧:等价写法

你可以把*(*(p2 + 1) + j)写成更简洁的形式:

(*p2)[j]// 第一行第 j 列(*(p2+1))[j]// 第二行第 j 列

或者直接用下标:

arr[1][j]

🧪 示例完整程序(供测试)

#include<iostream>usingnamespacestd;intmain(){intarr[2][4]={{1,2,3,4},{5,6,7,8}};int(*p2)[4]=arr;cout<<"**************"<<endl;cout<<"p2: "<<p2<<endl;cout<<"*p2: "<<*p2<<endl;cout<<"p2+1: "<<p2+1<<endl;cout<<"*(p2+1): "<<*(p2+1)<<endl;cout<<"**(p2+1): "<<**(p2+1)<<endl;cout<<"*(*(p2+1)+1): "<<*(*(p2+1)+1)<<endl;cout<<"*(*(p2+1)+2): "<<*(*(p2+1)+2)<<endl;cout<<"*(*(p2+1)+3): "<<*(*(p2+1)+3)<<endl;return0;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 4:37:10

AI Agent完全指南:从零开始掌握大模型新方向

本文详解AI Agent概念、框架与应用&#xff0c;探讨其作为大模型进阶方向的价值。AI Agent具备自主思考和行动能力&#xff0c;由控制端、感知端和行动端组成&#xff0c;可克服大模型知识更新慢、幻觉等缺陷。文章介绍了单代理、多代理和人机交互三种应用场景&#xff0c;并提…

作者头像 李华
网站建设 2026/4/13 6:23:55

【值得收藏】AI Agent核心概念:大模型智能体开发完全指南

文章介绍了AI Agent的核心概念与工作流程&#xff0c;由大脑(LLM负责决策规划)、感知(多模态信息采集)和行动(执行交互)三大模块构成。AI Agent通过"感知-大脑处理-行动-反馈"的循环迭代流程&#xff0c;理解环境并采取行动完成任务。这种架构使智能体能处理复杂任务…

作者头像 李华
网站建设 2026/4/18 8:57:46

【保姆级教程】从0到1掌握大模型(LLM)学习路线图,建议收藏!_我愿称之为26年最详细的大模型学习路线!

本文提供了一份从理论基础到落地应用的完整大模型(LLM)学习路线图&#xff0c;作者结合最新技术栈和个人经验整理&#xff0c;帮助初学者系统学习。文章强调拒绝焦虑&#xff0c;按图索骥&#xff0c;并提供免费领取完整版大模型AI学习资料的渠道&#xff0c;适合想要入门大模型…

作者头像 李华
网站建设 2026/4/21 1:51:20

大模型学习不迷茫!6大模块助你快速入门,实现职业跃迁!学习大模型的顺序,千万别弄反了

文章强调AI大模型是程序员未来5年的最佳发展方向&#xff0c;掌握应用开发逻辑和技术体系能实现职业升级。文章详细介绍了大模型学习的正确顺序和6大核心模块&#xff1a;基础认知、核心技术、开发能力、应用场景、项目落地和面试准备。通过系统学习这些内容&#xff0c;程序员…

作者头像 李华
网站建设 2026/4/23 12:33:48

Java计算机毕设之基于springboot的社区志愿者服务系统SpringBoot驱动的居民志愿服务智慧系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/23 0:10:08

ppo如果每个episode的宝藏位置都会变,时序特征还有意义吗

如果每个episode的宝藏位置都会变&#xff0c;时序特征还有意义吗Qwen3-Max这是一个非常深刻的问题&#xff0c;触及了强化学习&#xff08;RL&#xff09;中状态表示、时序建模与环境随机性的核心。✅ 简短回答&#xff1a;即使每个 episode 的宝藏位置都随机变化&#xff0c;…

作者头像 李华