一、定义二维数组
<1>定义方式
数据类型 数组名[行数][列数];
例如:
int a[3][4]; =====>3行4列
C语言对二维数组采用的这种特殊的定义方式,使得二维数组可以被看作一种特殊的一维数组:它的元素又是一个一维数组。例如:
上图中的a可以看出是一个一维数组,他有3个元素:
a[0],a[1],a[2].
每个元素又包含四个一维数组。
a[0]----------->a[0][0] a[0][1] a[0][2] a[0][3]
a[1]----------->a[1][0] a[1][1] a[1][2] a[1][3]
a[2]----------->a[2][0] a[2][1] a[2][2] a[2][3]
这里的a[0],a[1],a[2]我们把它叫做列指针。它指向了第一个元素的地址。
我曾经说过,一维数组的数组名就就数组首元素的首地址。
因此,这里我们
a[0]就指向了a[0][0]的首地址。
a[1]就指向了a[1][0]的首地址。
a[2]就指向了a[2][0]的首地址。
a[0] =======>&a[0][0]
a[1] =======>&a[1][0]
a[2] =======>&a[2][0]
注:a[0][0] 为一个int类型的数据,故我们的a[0]要用一个int *类型的指针来保存。
因此,列指针是一个一级指针类型。
以上的分析是针对我们的a[0],a[1],a[2]中子元素来分析。下面,我们来对我们的
二维数组的首元素a来说。它拥有三个元素a[0],a[1],a[2]。
我们可以用以下方式来访问者三个变量。
a >&a[0]
a + 1=>&a[1]
a + 2 ======>&a[2]
这里的a[0],a[1],a[2]都是指针常量,我们对常量取地址的话,相当与对整个数组的取大小。
故a是一个数组指针类型。这里的a,我们叫做行指针。
结论:行指针是一个数组指针类型。
下面我们来说说二维数组的特点:
(1)数组名标示数组的首地址
(2)二维数组的数组名是数组指针类型
(3)二维数组按行优先存放
综上所述,我们有了一个结论:
行指针类型:a , a + 1,a + 2----->加 + 1,移动一行元素的大小,它实质是一个数组
指针的类型。例如:int (*p)[2]
列指针类型:a[0],a[1],a[2] ->加1移动一个数据元素的大小,它实质是一个一维指针的类型。
例如:int *p;
行列指针变换的特点:
行指针 + *》列指针
a >&a[0] *a <>*(&a[0]) <=>a[0]
a + 1===>&a[1] *(a + 1) <=> *(&a[1] )<=> a[1]
a + 2 >&a[2] *(a + 2) <=> *(&a[2]) <=======>a[2]
列指针 + &========》行指针
&a[0] ============>a
&a[1] >a + 1
&a[2]>a + 2
思考:
int a[3][2];
a[1][1]这个元素的几种表示方式?
*(*a + 1 * 2 + 1) , *(a[1] + 1) , ((a + 1) + 1), *(&a[1][1])