一维数组与二维数组数组名应用及其数据类型
在应用数组的过程中,我们都会使用到数组名以及数组名与下标结合使用的情况,所以在老师总结后,我在这里总结一下这些情况。
首先在这里展示一张我们的老师总结的一张图,对下面的讲解有一定的帮助理解作用。里面有些东西比如像int *p,是一种指针类型的示意方式,请不要太过在意,只是一种示意而已,以下是该图:
一维数组
如图,我们定义了一个长度为4的一维数组(这个只是举例子,长度无所谓)
定义过程当然很简单就是int arr[4];
arr
arr有两种用法:
第一种用法中,它代表的是整个数组的长度(字节长度),最为常见就是的用法就是以下两种:
1.我们常用sizeof(arr)来求得整个数组所占的字节长度;
2.我们常用&arr+1来表示整个数组后面的一个字节的地址(当然其实到目前我自己还没有这么运用过)。
第二种用法就相当普遍了,这个arr用来表示数组首元素的地址,也就是arr[0]的地址,所以也就是说arr实际上是一个指针,由于示例是整型数组,所以就是一个整型的指针(当然这随着数组数据类型的改变而改变)。
arr+1
我们已知arr是数组首元素的地址,那么我们给这个指针加一的意思就是说,我们把这个指针移向下一元素的地址上,那我们就可以很容易理解到arr+1是arr[1]的地址,所以可以由此可以说arr+1就是一个指针变量。那我们可以由此可以推出arr+2是arr[2]的地址,arr+3是arr[3]是的地址……在一个正整数n小于数组长度下,arr+n是arr[n]的地址。
arr[0]
这个就不多说了,这个表示得是数组0号存储空间存储的数据,由于本例子是一个整型数组,所以数据类型是整型,当然随着数据类型变化而变化,这个具体情况具体分析了。
arr[0]+1
这个显而易见类似于arr+1,arr[0]是整型,所以arr[0]+1就是表示1号存储空间的数据,其实就等价于arr[1],当然也就是整型了,当然还是那句话,具体情况具体分析。
二维数组
如图,我们定义了一个三行四列的二维数组(这个只是举例子,长度无所谓)
定义过程当然很简单就是int brr[3][4];
由于前两个概念需要使用到优先级的概念,所以在这里我把这张展示运算符优先级的表先放在这里:
int *p[4]与int (*p)[4]
在介绍之前,先区分两个易于混淆的概念,我们由运算符优先级可以知道的是在*的优先级在()与[]之后所以不加小括号的情况下,p优先与[]结合,就是一个数组,我们平常对一个指针变量的声明的时候例如int *p;我们可以看到为了区分与普通变量区分的一个星号,所以用一个这样的星号用在一个数组上则表示这是一个指针数组。那如果加了()代表什么呢?由于优先级,我们可以发现()内先与星号结合了,那么根据平时一个普通的指针变量的定义,这是一个指针,接着()内的部分与[]结合,这表示这是一个指向一个长度为4的一维数组的指针变量,注意的是,这是指向一个数组的指针,而不是指向数组首地址的指针哦!
brr
其实之前的介绍就是为接下来这些部分做铺垫的。二维数组名brr其实就是一个指向一个定长一维数组的指针,我可以将这个三行四列的二维数组看成三个一位数组,就像第一张图中表示的把二维数组分成了红蓝绿三条一维数组,而brr就是指向红色一维数组的指针了,也就是指向首行一维数组的指针。
brr+1
可以参照brr和arr+1,我们就可以知道,brr+1是指向下一行的一维数组的指针,也就是指向蓝色块的一维数组的指针了,当然以此类推,那么brr+2就是指向绿色块的一维数组的指针了。所以推广到任意的二维数组,只要在不逾越行数的情况下,brr+n就是指向第n+1行(因为行标是从0开始)的一维数组的指针。
brr[0]
数组名加上一个下标又变成了什么呢?其实有点类似的是我们可以看到在图的下方有一个等式arr == brr[0]这个式子当然只是一个助于理解的式子,其实意思就是说我们可以把brr[0]类比于arr也就是一维数组的数组名,因为0是第一行的行标,所以brr[0]其实就是指向首行首元素的指针变量,那么一次类推brr[n]就是指向n+1行的首元素的指针变量。
brr[0]+1
在brr[0]中我们可以将brr[0]类比于arr,那么我们也可以将brr[0]+1类比于arr+1,也就是说这是一个指向首行第二个元素的指针变量,以此类推,那么brr[n]+n那么这就是一个指向第n+1行第n+1个元素的指针变量。
brr[0][0]
这个就不用多介绍了,类比于arr[0]也就是首行首元素本身了,直接利用下标使用元素,是整型。
这就是全部的介绍了,多有疏漏,敬请批评指正!