二维数组和它的指针

author author     2022-09-07     744

关键词:

这片文章介绍二维数组int a[ i ] [ j ]中的符号:a,&a[ i ],&a[ i ][ j ],a[ i ][ j ],&a[ i ] [ j ]的含义,重点在后面第二部分的分析,但是前面第一部分的复习数组指针,指针数组和二维指针是前提,前面的不会,后面的没法理解。这片文章写的有些费劲,个人能力不够,可能会有错误,希望各位朋友能够指正,共同进步。//握手

一:先回顾一下数组指针,指针数组,二维指针

先根据逐层分析分方法分析下面的代码 
(1)int (*p)[5]; 
(2)int *p[5]; 
(3)int **p;

看到上面的定义方式一一分析 
分析(1) 
第一步:找核心,核心是p 
第二步:由p向外一层分析,p和*结合是指针,再和[]结合,所以int (*p)[5] 是数组指针

分析(2) 
第一步:找核心,核心是p 
第二步:由核心p向外一层分析,p先和[]结合是数组,数组中元素是*类型,所以int *p[5];是指针数组。

分析(3) 
第一步:找核心,核心是p 
第二步:由p向外一层分析,p先和结合是指针,然后*p再和结合是指针的指针,即二重指针。

(4)二重指针和指针数组 
二重指针就是指针数组指针(有点乱哈)

先看指针数组 int *p[5]; 
(1)p是一个数组,数组有5个元素,每个元素都是int*类型 
(2)指向int * 类型的指针不就是int**嘛 
(3)得出结论,二重指针就是指针数组指针。

二:二维数组和指针的纠缠

先定义一个二维数组 int a[ i ] [ j ]; 
a是二维数组数组名,把二维数组看成一个平面。i表示有i行,j表示每行有j列。有一个一维数组int a[ 10 ],写成二维数组就是int a[ 2 ] [ 5 ],把10个元素分成2组,每组有5个元素。i表示第一维表示有多少组,j表示每组有多少元素。

符号含义 int a[ 2 ][ 5 ];int a[ i ] [ j ];

跟着思路一步一步走

第一维表示有2个一维数组分别是 a[ 0 ]和a[ 1 ](也就是a[ i ]和a[i+1]) 
第二维表示在这两个数组中分别有5个元素。

那么第一个问题来了

两个数组的数组名是谁?

对,a[ i ]和a[i+1] 既然a[ i ]和a[ i+1 ] 是一维数组名

那么第二个问题来了?

a[ i ]和a[ i+1 ]类型是什么?

一维数组数组名做右值表示数组首元素的首地址,首元素是int,首元素的地址是int * ,&b做右值表示整个数组的首地址,类型是int(*)[] 
int b[10]; 
int *p; 
p = b;

所以 a[i]这个数组名做右值表示数组首元素的首地址,首元素是一个数组,首元素的地址,数组的首地址是int * ,&a[i]表示整个数组的首地址(这个整个数组时指包含两个数组的那个数组)

!!这里很重要: 
迷惑1:a[i]做右值不是表示数组首元素的首地址吗?首元素是一个数组,那么其类型应该是数组的指针啊,类型是int( * ) [ ];

解答:a[i]这个数组名做右值确实表示数组首元素的首地址,比如int b[10];数组名b做右值表数组首元素的首地址,也就是相当于&b[0],那再二维数组中,a[ i ]和a[i+1]分别是两个数组,每个数组有5个int元素,这么一想就是了:a[ 0 ]这个数组名做右值时等价于&a[0][0],第1个数组的 
第1个元素,第一个元素是int类型,所以a[ i ]是int* 类型的指针。&a[ i ]表示整个数组(包含i个数组的大数组)的首地址,也就是看的是a[ i ]和a[ i+1 ]这两个数组的首地址,所以&a[ i ]的类型才是数组指针,int( * ) [ ];二维数组名a和&a[ i ]类型一致。

二维数组的运算 
int b[ 10 ]; 
下标访问b[ 1 ] 
指针访问* ( b+1)

int a[ 2 ] [ 10 ] 
下标访问a[ 1 ] [ 1 ] 
指针访问* ( * (a+1)+1)

分析:a是二维数组的数组名,在这肯定做右值,a做右值等价于&a[0]也就是第一个数组的首地址,(总共有两个数组),类型是int(*)[];这时候当a+1时,a指向谁?a是数组指针,a肯定指向数组,这时候a+1,偏移量为a[i]这个数组的大小,指向了a[1]这个小数组。每个小数组有5个元素,大小是一个int。这时候j的偏移量就是一个int的大小。

总结: 
(1)int a[ i ][ j ];二维数组表示有i个小数组,没个小数组有j个元素。 
(2)a[ 0 ]做右值表示& a[ 0] [ 0 ] 
&a[ 0 ]做右值和二维数组名a做右值含义一样。 
(3)a[ i ][ j ]表示每一个元素,每一个元素都是int类型的。 
&a[ i ] [ j ]表示int* 类型的指针。 
(4)a[ i ] [ j ] 等价于 * (* (a+i)+j)

二维数组比较难理解,难道真的是只可意会不可言传?虽然写了这篇文章,但总感觉不是很对,以我目前的水平无法找出错误,请高手指点。//感谢


本文出自 “13088918” 博客,转载请与作者联系!

行指针指向二维数组

指向多维数组的问题要注意一下:指针的使用灵活多变,一定要记好指向一位数组的指针它的形式是如何的:float(*pointer)[5] 一定要记好它是有小括号的,float*pointer[5]是错误的,不要犯此错误,当定义了二位数组floatstudent[10][... 查看详情

c语言中二维数组行指针是啥

先从存储的角度对二维数组作一个全面的了解。二维数组在内存中的存储,是按照先行后列依次存放的。从内存的角度看,可以这样说,二维数组其实就是一个一维数组,在内存中没有二维的概念。如果把二维数组的每一行看成... 查看详情

二维数组和指针

二维数组和指针⑴用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体... 查看详情

c语言二级指针作为输入(二维数组|二维数组遍历|二维数组排序)(代码片段)

文章目录一、二维数组1、二维数组声明及初始化2、二维数组遍历3、二维数组排序二、完整代码示例一、二维数组前几篇博客中,介绍的是指针数组;指针数组的结构特征是,数组中的每个元素,即每个指针变量可以指向不同大小的... 查看详情

二维数组数组指针以及指针数组

 1.二维数组定义  格式:数据类型数组名[行][列];  示例:intbuff[3][5];  第一个[3]表示二维数组buff中有3个一位数组  第二个[5]表示每个一维数组中有5个成员。  若二维数组定义时进行初始... 查看详情

c语言二级指针内存模型(指针数组|二维数组|自定义二级指针|将一二模型数据拷贝到三模型中并排序)(代码片段)

文章目录一、指针数组和二维数组数据拷贝到自定义二级指针中1、函数形参设计规则2、三种内存模型对应函数形参指针退化规则二、完整代码示例一、指针数组和二维数组数据拷贝到自定义二级指针中将指针数组和二维数组中... 查看详情

c语言二级指针作为输入(二维数组|抽象业务函数|二维数组打印函数|二维数组排序函数)(代码片段)

文章目录一、抽象二维数组业务函数1、二维数组打印函数2、二维数组排序函数二、完整代码示例一、抽象二维数组业务函数1、二维数组打印函数注意,二维数组作为函数参数输入到函数中,不能传入二维指针;此处遍历时,注意指... 查看详情

二维数组的指针

定义一个一维数组inta[3];那么他的指针是:int*p=a定义一个二维数组:intb[3][6];指针:int**P=b  //错误正确的指针是:int (*p)[6];p=b;  查看详情

二维数组和二级指针关系浅析

...一个数组可以这样定义chara[3];分配了3个字节的内存  二维数组可以这样定义charb[3][3];分配了3* 查看详情

c语言二级指针作为输入(二维数组|二维数组内存大小计算|指针跳转步长问题)(代码片段)

文章目录一、二维数组内存大小计算二、二维数组内存大小意义一、二维数组内存大小计算给定一个二维数组:该二维数组中有444个一维数组,每个一维数组有101010个char数据;//I.二维数组chararray[4][10]="abc","123","258&... 查看详情

二维数组和数组指针的关系

  昨天既然写了一些关于数组指针的话题,那么今天就写一些关于数组指针的话题吧!  数组指针:这样读数组的指针,即指向数组的指针,就是数组指针,其本质就是一个指针  比如:int(*a)[3];就是一个数组指针,运用... 查看详情

指针c ++的模板数组?

】指针c++的模板数组?【英文标题】:Templatearrayofpointersc++?【发布时间】:2016-07-2213:26:27【问题描述】:大家好,在我的c++程序中,我有四个类(A、B、C、D)A是基类B继承自AC继承自AD继承自B它们都是模板类template<classType&am... 查看详情

c语言二级指针内存模型图(指针数组|二维数组|自定义二级指针内存)(代码片段)

文章目录前言一、指针数组二、二维数组三、自定义二维指针内存前言绘制如下333种二级指针的内存模型://I.指针数组char*p1[]="12","ab","34";//II.二维数组charp2[3][4]="12","ab","34";//III.自定义二... 查看详情

指针和二维数组

 array这里指向的是第一行的五个元素 可以证明:    我画了一个图 二维数组指针的结论:①所谓的多维数组其实就是一维数组线性扩展得到的  一道题目:  查看详情

关于数组以为指针二维指针的应用举例

...多维数组其实最终还是以一维数组的形式实现的。就NxM的二维数组来讲,设其数组名为array。指针array指向一个数组,该数组存放的是一系列指针,这些指针分别指向相应的一维数组,而这些数组中存放的才是我们的数据。 &n... 查看详情

c语言二维数组指针变量是啥,int(*p)[2]啥意思

二维数组指针变量形式如下:类型名(*数组名)[数组行数][数组列数]如:int(*p)[2][3];//定义一个int类型的二维数组指针变量,数组中每个元素都是一个指针int(*p)[2]表示定义一个数组指针,只是是一个一维的数组指针,数组中每个元... 查看详情

指针与二维数组

二维数组的本质:intmatrix[3][4];intmatrix[3][4];  ==>int[4]matrix[3];    令type为int[4];  typeint[3];说明matrix是一个数组,有3个元素;每一个元素是int[4]类型的;实质上int[4]就是一个拥有4个int元素的一维数组。事实上,... 查看详情

关于返回二维数组指针问题

  所谓的二维数组指针,是指针的指针,指的就是二维数组在内存中的存储地址。二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址)。行的首地址... 查看详情