C/C++中二维数组和指针关系分析

2023-05-16

        在C/c++中,数组和指针有着密切的关系,有很多地方说数组就是指针式错误的一种说法。这两者是不同的数据结构。其实,在C/c++中没有所谓的二维数组,书面表达就是数组的数组。我猜想是为了表述方便才叫它二维数组。

       在本文中,我也就叫它二维数组。在C/C++中,二维数组是数组的数组。数组的每一个元素是一个数组。说起来有点绕,大家都知道,一维数组也和指针那关比较密切,在本文中不重点阐述,下面就来阐述二维数组和指针之间到底存在着什么样的关系。

      一、二维数组一维化

           其实我这里也只是表述的方便才叫这么一个题目,我们怎么利用一个数组的访问方式来访问二维数组呢?下面来看一个具体的例子。

           首先,定义一个二维数组。

         

int iArr[2][3]={0,1,2,3,4,5};


我们可以用一个指向int型的指针变量来访问这个数组,下面的代码是将数组一维化:

int* p = iArr[0];

上面的iArr[0]就是代表第一个数组的首地址,由于二维数组在内存中的存储也是先行后列的方式,所以第二行也紧跟第一行之后,这样就可以用p来访问数组的元素值了,访问的方式有下标和指针方式。

	printf("%d,",p[3]);
	printf("%d\n",*(p+3));

最后输出的结果都是3。讲完了一维化之后,下面来继续看二维数组的函数名到底是什么意思?

 

        二、关于二维数组名的探索

      可能想当然的话,二维数组不就是一个二级指针吗?真是这样吗?下面用代码来验证下:

    

	int **pp = iArr;

       不出意外,会出现下面的编译错误:

      error C2440: “初始化”: 无法从“int [2][3]”转换为“int **”

      其实二维数组名是一个数组指针,那什么是数组指针?数组指针是指向一个数组首地址的指针,它实际上也是一种指针类型,类似于函数指针。它声明如下: 

	int (*pArr)[3]

      它说明pArr是一个数组指针,它指向的是一个数组元素为int类型并且数组元素的个数为3的一个数组指针,奇怪,中间的怎么还有一个括号是啥玩意?呵呵,这个括号还真是不可少的。少了它就变为另外一种类型了:指针数组。指针数组是数组类型,代表数组的每一个元素是指针类型,它声明如下:int  *pArr[3]。

      既然二维数组的数组名是指向第一行数组的首地址,我们也叫它行指针。那么我们可以用这种数组名或者指针来访问二维数组的元素。

    

int (*pArr)[3] = iArr;

下面,我要访问第一行第二列的元素,我可以用下面的代码来访问

	*(*(pArr+1) + 2)

也可以用数组名来访问:

*(*(iArr+1) + 2)

这种方式是不是一下很难看懂,为什么两个星号啊?下面就我的理解来作一下解释。仅以pArr做说明

首先,pArr是一个指向数组的指针,在这个指针上加减一个整数都是移动整行,而不是一个元素。比如说,pArr+1代表的现在指针已经指向第一行元素了,也就是实际中的第二行,而要取得指针所指的对象,就要用到解引用运算符*,所以*(pArr+1)就代表第一行数组,是整个这一行元素就取到了,那现在要取这一行的第二个元素,只须将指针再移动两个元素,即*(iArr+1) + 2,这样就指向了这个元素的地址,再解引用取得元素的值即可。说的有点啰嗦,或许有错误,望高手别喷就是了。

 

        三、作为函数参数

       一维数组名作为函数参数实际上是退化为指针,二维数组作为函数参数又有什么不同呢?下面举个例子说明。

 声明了如下函数:

void TestFun(int *pArr,int nlength)

假设,我用数组名和指向首个元素地址的指针作为传递参数,看看有什么效果?

TestFun(iArr,6);//“TestFun”: 不能将参数 1 从“int [2][3]”转换为“int *”
TestFun(&iArr[0][0],6);

直接传递数组名是编译通不过的。因为数组名是数组指针,而函数的参数是int*,两者的类型化完全不一样,所以不能转换。

而数组首元素的地址显然是int*类型,所以就能编译通过。

 

假设,我现在把这个函数的声明换一下,看看这两种传参的方法会出现什么情况?

现在的声明是:

void TestFun(void *pArr,int nlength)

还是这样传参,

	TestFun(iArr,6);
	TestFun(&iArr[0][0],6);

编译一下,居然都能通过了。在这里,第二种方式显然是没问题的,因为int*可以转化为void*。而第一种方式怎么就可以了呢?因为iArr是数组指针,当然也可以转换为void*啦。

 

四、后记

     天快黑了,要吃饭去了。本文就写到这里,文中有什么不对的地方,可以指出来,大家一起讨论。

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

C/C++中二维数组和指针关系分析 的相关文章

  • vnc使用图文教程,vnc使用图文教程(含图片教程)

    vnc使用图文教程不知道大家找到过没有 xff0c 毕竟在网上这种教程是很少的 xff0c 因为使用的人都是一些经常使用的 xff0c 但是对于小编这种基础能力差的 xff0c 还是需要vnc使用图文教程的 xff0c 所以小编也是努力了很
  • python中的MapReduce函数和过程浅析

    map reduce思想是Google的JeffDean在2008年在论文 MapReduce Simplified Data Processing on Large Clusters 中提出的 xff0c 而python中沿用了这种思想并
  • openMP学习笔记之一 -- 杂记

    1 使用libffi启动执行 xff0c ffi全称Foreign Function Interface xff0c 参考https www cnblogs com findumars p 4882620 html的介绍 xff0c 2 在
  • Vue系列之—Vue-router详解

    目录 一 简介 1 1 单页面应用 1 2 路由管理器 二 起步 2 1 动态路由匹配 2 2 路由组件传参 2 3 嵌套路由 声明式 编程式导航 命名路由 命名视图 重定向和别名 三 进阶 导航守卫 全局的守卫 路由独享的守卫 一 简介
  • vscode 代码格式化及快捷键

    VSCode 代码格式化 快捷键 On Windows Shift 43 Alt 43 F On Mac Shift 43 Option 43 F On Ubuntu Ctrl 43 Shift 43 I 代码格式化 vscode默认启用了
  • ORB-SLAM2添加稠密建图线程

    注 xff1a 本篇文章只是对高翔博士稠密点云代码进行的简述 xff0c 内容主要包括的是在ORB SLAM2基础上怎么添加稠密建图线程 xff0c 并未对高翔博士代码进行改动 本文章仅用于自己学习记录 xff0c 若有侵权麻烦私聊联系删除
  • ubuntu挂载sd卡到分区目录+修改docker镜像存储位置

    ubuntu挂载sd卡到分区目录 43 修改docker镜像存储位置 一 挂载SD卡到 data 1 查看Linux硬盘信息 lsblk 或 fdisk l lsblk 新的硬盘 xff0c 最好删除之前的分区 xff0c 再新建分区 de
  • Ubuntu虚拟机安装EDA工具:VCS+Verdi+dve2018方法教程

    上个月刚完成Ubuntu虚拟机的安装 xff0c 本教程的基础是你已经安装好了Ubuntu的虚拟机 xff0c 最好是和笔者版本接近的Ubuntu xff0c 具体安装方法已在之前的文章中介绍过了 xff1a https blog csdn
  • 基于deepstream-test3添加跟踪插件和4类sinkType输出(包括rtsp)

    基于deepstream test3添加目标跟踪插件和4类sinkType输出 xff08 包括rtsp输入输出 xff09 deepstream C C 43 43 deepstream官方示例没有给出一个单管道的多类输入和4类sinkT
  • 国外学位论文查找

    转自 xff1a http blog chinaunix net uid 20517852 id 1936377 html 国外博士论文下载的网站 xff0c 不知道以前发过没有 http search ohiolink edu etd i
  • DirectShow播放器(LAVFilter + EVR)开发例子

    LAVFilter是一套著名的DirectShow插件 xff0c 包括Demux xff0c Video Decoder xff0c AudioDecoder xff0c 播放文件所需要的几个重要插件都包含进去了 xff0c 并且支持播放
  • 关于最新版的keil5不能正常调试或者调试过程自动停止的解决方法

    适用范围 1 在进入debug的功能中提示J link is defective xff0c 大概意思就是最新版的J LINK驱动跟正在用的硬件不匹配 xff0c 要你更换驱动或者更换硬件 xff08 其实是使用盗版的J LINK会出现的问
  • C++11变参模板的参数包

    Parameter pack 原文来自这里 A template parameter pack is a template parameter that accepts zero or more template arguments non
  • Linux socket 关闭场景

    测试环境 root 64 centos192 168 1 12 cat etc system release CentOS release 6 9 Final 工具 xff1a 服务器 192 168 1 12 ipython Python
  • QGroundControl地面站二次开发环境搭建(win+linux+android)

    更新时间 xff1a 2017 6 19 大家好 xff0c 我是learn xff0c 下面主要介绍一下QGroundControl地面站的环境搭建 网上也有好多教程 xff0c 我就不再麻烦了 xff0c 补充一下好了 http blo
  • std::vector用法

    vector 是C 43 43 标准模板库中的部分内容 xff0c 它是一个多功能的 xff0c 能够操作多种数据结构和算法的模板类和函数库 vector之所以被认为是一个容器 xff0c 是因为它能够像容器一样存放各种类型的对象 xff0
  • Linux串口(serial、uart)驱动程序设计

    一 核心数据结构 串口驱动有3个核心数据结构 xff0c 它们都定义在 lt include linux serial core h gt 1 uart driver uart driver包含了串口设备名 串口驱动名 主次设备号 串口控制
  • Xshell 5 评估过期,需要采购,不能使用的解决办法

    Xshell 5 当然 xff0c 现在我们可以直接撸 Xshell 6 了 卸载原来的 Xshell 5进入 Xshell 5 官网 xff1a https www netsarang com页面上点导航栏的 Free Licence x

随机推荐

  • mapreduce编程(一)-二次排序

    mr自带的例子中的源码SecondarySort xff0c 我重新写了一下 xff0c 基本没变 这个例子中定义的map和reduce如下 xff0c 关键是它对输入输出类型的定义 xff1a xff08 java泛型编程 xff09 p
  • Android apk执行shell脚本 工具类

    在做Android应用时 xff0c 经常需要执行shell脚本 xff0c 以快速实现某些功能 xff1b 在Android应用程序中执行shell脚本可以省去一大堆繁琐的代码 xff0c 还可以避免不必要的错误 xff1b 比如 xff
  • Python最强装逼神技!微信远程控制电脑,想让你电脑关机就关机!

    今天带给大家一个非常有意思的 python 程序 xff0c 基于 itchat 实现微信控制电脑 你可以通过在微信发送命令 xff0c 来拍摄当前电脑的使用者 xff0c 然后图片会发送到你的微信上 甚至你可以发送命令来远程关闭电脑 程序
  • 基于ESKF的IMU姿态融合【附MATLAB代码】

    目录 0 前言1 什么是ESKF2 系统方程2 1 状态变量2 2 imu的测量值2 3 预测方程及雅克比矩阵2 4 测量方程及雅克比矩阵 3 kalman filter loop计算4 Show me the code5 代码下载链接 0
  • 【笔记】自适应卡尔曼滤波 Adaptive Extended Kalman Filter

    0 阅读文章 Adaptive Adjustment of Noise Covariance in Kalman Filter for Dynamic State Estimation 1 主要内容 一般情况下 xff0c kalman中的
  • 二、Docker:Dockerfile的使用、指令详解和示例

    什么是 Dockerfile xff1f Dockerfile 是一个用来构建镜像的文本文件 xff0c 文本内容包含了一条条构建镜像所需的指令和说明 使用 Dockerfile 定制镜像 1 使用 dockerfile 定制 nginx
  • # STM32中断方式实现串口通信(标准库)

    STM32中断方式实现串口通信 xff08 标准库 xff09 文章目录 STM32中断方式实现串口通信 xff08 标准库 xff09 一 串口通信原理以及中断原理一 问题分析1 涉及外设2 状态机实现 二 创建MDK xff08 kei
  • 一张图看懂阿里云网络产品[一]网络产品概览

    一张图看懂网络产品系列文章 xff0c 让用户用最少的时间了解网络产品 xff0c 本文章是第一篇 网络产品概览 系列文章持续更新中 xff0c 敬请关注 xff3b 一 xff3d 网络产品概览 xff3b 二 xff3d VPC xff
  • MapReduce原理及编程实现

    文章目录 MapReduce原理及编程实现MapReduce基本概念MapReduce执行过程Mapper阶段Reducer阶段Combiner类Partitioner类 MapReduce实现WordCountKey amp Value类
  • 2020-10-20 学习日志(Crazepony控制环)

    2020年10月20日 学习任务 xff1a 完成Crazepony控制环的理解 之前是通过姿态解算获得了 四元数 旋转矩阵 欧拉角 CtrlAttiRate void CtrlAttiRate void float yawRateTarg
  • STL学习笔记之迭代器--iterator

    STL设计的精髓在于 xff0c 把容器 xff08 Containers xff09 和算法 xff08 Algorithms xff09 分开 xff0c 彼此独立设计 xff0c 最后再用迭代器 xff08 Iterator xff0
  • 提升工作效率之PCB设计软件“立创EDA”

    文章目录 前言一 立创EDA二 PCB生产三 团队功能总结 前言 由于工作需要设计一款硬件调试小工具 xff0c 考虑到器件采购和PCB制版都在立创商城上进行 xff0c 索性就试用立创EDA进行PCB设计 结论在前 xff1a 立创线上E
  • nvidia显卡,驱动以及cuda版本对应查询

    实验室新买了一块rtx 2080和titan rtx xff0c 需要分别配置驱动和cuda xff0c 但是一直也找不到显卡和cuda的官方对照表 xff0c 每次都是百度 谷歌 必应 xff0c 参考别人安装之旅 今天突然发现了驱动和c
  • LoRa 信噪比和接收灵敏度

    文章目录 前言一 信噪比极限 xff08 SNR LIMIT xff09 二 接收灵敏度 前言 介绍信噪比极限和如何计算接收灵敏度 参考资料 xff1a LoRa信噪比和接收灵敏度 一 信噪比极限 xff08 SNR LIMIT xff09
  • C在字符串后面加/0和0

    使用复制字符串时 xff0c 经常会遇到字符串后面跟着一大堆莫名其妙的字符串 xff0c 例如屯屯屯 之类的东西 xff0c 这是因为在使用字符串时没有在字符串结尾加 0或0 通常分配一块内存到堆上或栈上时 xff0c 内存区域可能会有之前
  • 基于k8s+prometheus实现双vip可监控Web高可用集群

    目录 一 规划整个项目的拓扑结构和项目的思维导图 二 修改好各个主机的主机名 xff0c 并配置好每台机器的ip地址 网关和dns等 2 1修改每个主机的ip地址和主机名 2 2 关闭firewalld和selinux 三 使用k8s实现W
  • PX4源码开发人员文档(一)——软件架构

    软件架构 PX4 在广播消息网络内 xff0c 按照一组节点 xff08 nodes xff09 的形式进行组织 xff0c 网络之间使用像如 姿态 和 位置 之类的语义通道来传递系统状态 软件的堆栈结构主要分为四层 应用程序接口 提供给a
  • ardupilot线程理解

    对于apm和pixhawk一直存在疑惑 xff0c 到现在还不是特别清楚 今天在http dev ardupilot com 看到下面的说明 xff0c 感觉很有用 xff0c 对于整体理解amp代码很有帮助 xff0c 所以记下来 转载请
  • Pixhawk源码笔记三:串行接口UART和Console

    这里 xff0c 我们对 APM UART Console 接口进行讲解 如有问题 xff0c 可以交流30175224 64 qq com 新浪 64 WalkAnt xff0c 转载本博客文章 xff0c 请注明出处 xff0c 以便更
  • C/C++中二维数组和指针关系分析

    在C c 43 43 中 xff0c 数组和指针有着密切的关系 xff0c 有很多地方说数组就是指针式错误的一种说法 这两者是不同的数据结构 其实 xff0c 在C c 43 43 中没有所谓的二维数组 xff0c 书面表达就是数组的数组