C语言二维数组,三维数组浅析笔记

2023-10-30

关于二维数组:

int arr[2][3]={1,2,3,4,5,6};

前言:可以将二维数组理解为"数组的数组"。数组名a为行指针

        从二维数组角度看,arr代表了二维数组首元素的地址。现在首元素不是一个单独的变量,而是一个一维数组。因此arr代表了首行的首地址。a+1就是下一行的地址。也可以表示为a[1],同理都有a[0],a[2]。分别表示第0行和第二行的地址。既然他们都是地址(也就是一维数组名,C语言规定一维数组的数组名代表了数组首元素的地址),a[0]也就表示了第0行第一个元素的地址。也就是&a[0][0]。a[1]的值就是&a[1][0]。

        表示0行1列的地址时,用a[0]+1 表示,它与a+1的区别在于a[0]是0行的首地址,a[0]+1是在一维数组中操作,+1 也就是加了sizeof(int) 大小。在a+1时候,因为二维数组可以理解为数组的数组,也就是一个数组里面的变量是一个个的数组。则此时这个a数组名字也就相当于一维数组的名字。它代表了首元素的地址,这是多次提到的。给a+1,相当于加到了a数组的第二个元素,而每个元素其实是一个数组。也就是跨过了一行。此时到了第一行。此时的地址就是a+sizeof(int)*列数。 要想找到1行1列的地址时,也就是a[1]+1。要注意的是a[1]的地址同时也是数组里面元素数组的首地址。为了便于理解,里面抽象了两个一维数组。一个是二维数组抽象为一个数组的数组,第二个就是数组里面的元素是一个数组。在内存中,他们的内存单元其实是连续的,这里只是为了方便理解。前面都是用[]取值,我们也可以用*号。0行1列的地址也可以表示为*(a+0)+1,1行1列地址为*(a+1)+1,0行1列的值为*(*(a+0)+1),对地址取值就是所指向的对象的值。(此为补充理解,理解这段解释后基本已经理解了二维数组,这段是在我后面总结加入的理解,与下面内容有很多重复。但是也可以看看,加强理解)

数组名是:arr : int(*p)[4];   // 首行的地址 ,数组指针,也就是指向数组的指针,此处p为指向4个int变量的数组 

                  arr+1: int(*p)[4]; //第二行的地址,

                  arr[0]: int * //arr中第0列的元素地址,也就是第一个元素 的地址,可以理解为取出来了一个一维数组,一维数组名字为指向数组首元素的指针(并不是真的指针,可以这样理解),所以此处取值后仍然为int *。 

  1. arr[0]+1: int * ;    //arr中第0列元素下一个元素的地址 arr[0][1]
  2. *arr: int  ;               // 第一个元素的值
  3. *( *(arr+1)+1):int  // 首先是arr+1 指向了第二行的地址,解引用后为int* 指针(相当于一维数组的名字),然后+1则相应的列+1,然后解引用,int*解引用取到值。也就是arr[1][1]的值。
  4. //上面需要好好理解

关于三维数组:

int arr[3][2][2]={0,1,2,3,4,5,6,7};//相当于3个2 * 2 的二维数组
printf("%d %d %d %d\n",&arr[0],&arr[0][0],&arra[0][0][0],&array); //结果都是相同的,说明其指向都是相同的。
//如果说把三维数组比作一个立方体的话,那么这个立方体底边是个2*2的正方形,高为3
//注意:三维数组的高维度是写在最前面的,也就是立方体的h

按照理解那么此三维数组一共三层,第一层为 arr[0][0][0],arr[0][0][1],arr[0][1][0],arr[0][1][1], 第二次为 arr[1][0][0],arr[1][0][1],arr[1][1[0],arr[1][1][1],第三层类似。需要注意的是第三层会默认初始化为0。

可以发现 假设没有高h后,也就是没有第一列维度后,数组是一个二维数组。那么arr指向的就是一个二维数组。

 1.arr:int (*p)[][];              // 第一层第一个元素地址

 2.arr+1:int(*p)[][];           //指向了第二层

 3. arr[0]:int(*p)[] ;             // 解引用后 为一个数组指针,作用和二维数组的行指针相同。可以对比学习。

 4.arr[0][0]:int *;               //继续解引用后为一个int指针,此时已经为一维数组,相当于取到了一维数组的名字,此时还是指针,                 

  5.arr[0][0][0]:int ;         //显而易见,此时取到一维数组的第一个值,也就是二维数组的第一个值,也就是三维数组的第一个值。   要好好分析理解。  

 

总结:

        1.一维数组名字代表指向变量的指针,二维数组名字代表指向数组的指针,三维数组名字代表指向了二维数组的指针。关系是层层递进的。只要理解了二维与一维的关系,那么二维与三维也就很好理解。四维也不在话下。

        2.在面对问题时,考虑二点:

        优先级:()>[]>*;

      若是指针(*)看指向什么东西,若是数组([]),看数组长度和类型,若是函数 (()),看参数列表和返回值。这个是函数指针,指针函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言二维数组,三维数组浅析笔记 的相关文章

随机推荐

  • kali安装SRC挖掘利器—ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统安装教程

    目录 先参考kali安装Docker 卸载旧版本 配置Docker以在启动时启动 Linux的安装后步骤 Docker 启动 文章参考地址 https www 77169 net download 267781 html 本地搭建 Kali
  • 对extern,static,const的再认识

    const const修饰的值为常量 是不可改变的 在c 语言中是不可改变的 而在C语言中 我们可以通过指针去修改那一片地址的值 const修饰的指针 表面指针指向或者指针的值是不可被修改的 我们可以通过通配符 的位置来判断 在左说明修饰的
  • 测试计划等模板

    一 测试计划 测试范围 测试策略 测试资源 人员分配 时间安排 进度 风险评估 测试目的 测试背景 二 测试用例 测试用例编号 标题 所属模块 前置条件 操作步骤 输入数据 预期结果 实际结果 三 缺陷报告 缺陷编号 缺陷标题 缺陷状态 缺
  • vue-cropper 截图组件踩坑记

    安装 npm install save vue cropper 封装组件
  • 刷脸支付不用排队节约了时间

    科技改变人们生活 科技推动人类社会进步 近几年移动支付崛起 让人们实现了 一个手机走天下 的便捷 而如今 随着人工智能 大数据等技术的积累突破 支付方式再一次出现重大突破 即将从手机移动支付跨越到刷脸支付时代 据了解 刷脸支付技术已经成熟
  • golang实现http(s)代理

    简单原理 最近需要用golang去实现一个http s 的代理 简单的解释一下 实现过程就是首先启动一个http s 的服务 这个很简单 demo一大堆 我就不多说了 接下来要实现代理 很简单的原理就是 通过你实现的http s 服务接收到
  • python编写shell脚本详细讲解_python编写shell脚本详细讲解

    今天同事叫我编写一个shell脚本 话说 虽然我受 nix的影响甚深 但是对于 nix 里随处可见的sh脚本却是讨厌之极 为什么讨厌呢 首先是因为sh脚本那莫名其妙的语法 感觉就像随写随扔的程序 完全没有任何美感可言 其次是sh脚本的处理能
  • 我为什么选择go语言

    这里 我并不打算引起语言争论的口水仗 我并不是什么大牛 对语言的造诣也不深 只是想通过自己实际的经历 来说说为什么我在项目中选择go 其他语言的经历 C 在接触go之前 我已经有多年的c 开发经验 主要用在游戏服务端引擎开发以及P2P上面
  • pycharm调试时,控制台输入出现the view is read-only和pause the process to use the command line

    仅作为记录 大佬请跳过 文章目录 the view is read only pause the process to use the command line the view is read only 点击切换几次就好了 pause t
  • 【QT进阶】第十一章 QJson的创建与读取解析 - 实例天气获取并解析

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • error info mysql_UCenter info: MySQL Query Error (UCenter一个错误的解决)

    错误信息 UCenter info MySQL Query Error SQL SELECT FROM Table notelist WHERE closed 0 AND app2 5 LIMIT 1 Error Unknown colum
  • 分布式网络通信框架(十一)——logger日志系统设计实现

    日志模块的设计 本项目所实现的日志模块采用异步工作方式 多个线程往队列写日志 一个专门的写线程从队列中读取日志信息写入磁盘中的日志文件 要点 线程安全 线程间通信 队列 生产者消费者模型 日志模块设计图如下 源代码实现 队列的实现 模板类的
  • SpringCloud使用Consul作为服务注册发现中心

    本篇文章主要记录SpringCloud使用Consul作为服务注册发现中心 通过服务提供者和消费者为例 来真正掌握Consul注册中心 目录 一 前言 二 搭建服务提供者 1 创建cloud provider payment8004项目 2
  • 基于粒子群改进的灰色神经网络的时间序列预测

    基于粒子群改进的灰色神经网络的时间序列预测 时间序列预测在许多领域中都具有重要的应用价值 如股票市场预测 气候变化预测等 针对时间序列预测问题 传统的预测模型往往面临着数据不稳定性和非线性特征的挑战 为了提高预测准确度 研究人员提出了许多改
  • QT 中与我们思维不符的片段

    1 如下 第二个lastIndexOf返回6 不太符合我们的思维 按理说匹配的是前7个字符 但实际匹配的是 crazy az 就是说加上了 strlen az 1 这个匹配串首字母外的长度 QString x crazy azimuths
  • 百度富文本编辑器UEditor的使用

    引入富文本编辑器 1 下载地址 https ueditor baidu com website download html 2 导入项目 3 文件引用
  • Java Web 安全之XSS

    概念 跨站脚本攻击 Cross Site Scripting 简称XSS 恶意攻击者往Web页面里插入恶意Script代码 当用户浏览该页之时 嵌入其中Web里面的Script代码会被执行 从而达到恶意攻击用户的目的 原理 攻击者在客户端以
  • CentOS8服务篇1:配置DNS服务器

    一 配置主DNS服务器 伯克利因特网名称域 Berkeley Internet Name Domain BIND 服务是全球范围内使用非常广泛 安全可靠且高效的域名解析服务程序 DNS域名解析服务作为互联网基础设施服务 其责任非常重大 因此
  • Q_D Q_D Q_DECLARE_PRIVATE Q_DECLARE_PUBLIC

    对于Q D Q D Q DECLARE PRIVATE Q DECLARE PUBLIC这几个宏的使用折腾了好长一段时间 在网上也找了很多相关的资料 看完之后还是感觉很凌乱 最后还是决定自己写段代码来体会体会 一下是体验过程
  • C语言二维数组,三维数组浅析笔记

    关于二维数组 int arr 2 3 1 2 3 4 5 6 前言 可以将二维数组理解为 数组的数组 数组名a为行指针 从二维数组角度看 arr代表了二维数组首元素的地址 现在首元素不是一个单独的变量 而是一个一维数组 因此arr代表了首行