二维数组指针(二)
在(一)中,我们简单的讲解了简单指针,内容包含三部分数组作为形参,解引用,定义指针,这小节我根据自己的认识讲解一点二维数组的认知
什么是二维数组?
二维数组形如 int arr[ 3 ][ 4 ] ,这样形式的数组,在一维数组中 我们说 int arr[ 3 ]={1,2,3} 代表一个数组arr中含有3个整型元素,那么 int arr[ 3 ][ 4 ] 跟一维数组类似,表示 数组arr中含有 3*4=12个整型元素,也可以像理解一维数组一样理解二维数组
arr[ 3 ][ 4 ]={ {1,2,3}, {4,5,6,}, {7,8,9} } ,二维数组其实是数组的数组,即数组arr含有3个一维数组,每个一维数组含有4个整型元素,个人是这样理解arr[ 3][4 ] 同等于 arr[3]={ arr[0] , arr[1] , ar r[2] } (个人理解) 也可以理解为3*4的矩阵
int a[3][4] 最好的官方理解就是3*4方阵
a[0] → arr[0][0] arr[0][1] arr[0][2] arr[0][3]
a[1] → arr[1][0] arr[1][1] arr[1][2] arr[1][3]
a[2] → arr[2][0] arr[2][1] arr[2][2] arr[2][3]
现在讲几个概念
当数组名 单独存在一个printf语句输出内容中 或&a单独存在的时候时 表示一个数组整体
printf("%d,"sizeof(a)) 48 整个数组的大小,12个元素,一个元素四个字节(int在vs2008占4字 节)
printf("%d,"sizeof(&a)) 假如 数组a的第一个元素地址是2000,那么前面的printf语句结果为 2000+12*4
*a a并没有单独存在,还有一个解引用,在一维数组中,数组名就是一个指针,指向数组的第一个元 素 ,那么在二维数组中也类似(联想3*4的矩阵),指针实际是指向数组的0行首元素,*a就是 第0行第0列元素的地址
a+i 指向第 i 行首元素,那么结合上一题,那么可以这样总结,对于二位数组,a的+/-实际上是对行的 加减
a[i] 指向第i行首元素
*(a+i) 对第i行首元素解引用,实际就是第 i 行首元素地址
*(a+i)+j 在一维数组中,a={0,1,2} a指向0,当a+3指向的就是元素2,同理,指针a指向第 i 行第 j 列的元 素,解引用为第 i 行第 j 列的元素的地址(可以这样理解,*(a+i)则是对数组的数组进行操作,a+i指向第 i 行首元素,解引用后就是进入了数组(a[0],a[1],a[2])的数组里面,*a[ i+0 ]+1实际就是当前部分解引用,指针从a[0] a[1] a[2]进入a[0]中,就指向a[0][0],+j 指针移动到 a [ 0 ] [ j ]的位置 )
*(*(a+i)+j) 整体来看 其实就是对上式解引用,其实就是第 i 行第 j 列的元素的值
&a[i] a[ i ]是表达第 i 行首元素地址
&a[i][j] a[ i ][ j ]是表达第 i 行第 j 列元素地址
&(a+i) 第i行的首地址
搞懂了这些,你的二维数组也基本理解了,下次我们将讲一些这些鬼玩意儿的应用,坑很多