二维数组:
多维数组就是具有两个或两个以上下标的的数组
在c语言中,二维数组的元素连续存储,按行优先存
a[0]=*(a+0) a[1]=*(a+1) a[i]=*(a+i)
可以认为,二维数组有几行就有几个一维数组
#include <stdio.h>
int main(int argc , char *argv[]){
int a[3][2] = {{1,6},{9, 12}, {61, 12}};
int *p,i,n;
n = sizeof(a) / sizeof(int);
p = a[0]//&a[0][0];
printf("%p %p\n", p, p+1);
printf( "%p %p\n", a, a+1);
for (i = 0; i < n; i++)
printf("%d",*(p+i));
puts("");
return 0;
}
上图:p=a[0]//&a[0][0] 这里的p和a并不一样,因为a是二维数组 它是一行一行走的,而p是一级指针是一个数一个数走,所以运行出来,地址不相同
可把二维数组看作由多个一维数组组成,比如int a[3][3],含有三个元素 : a[0]、a[1]、a[2]元素a[0]、a[1]、a[2]都是一维数组名
二维数组名代表数组的起始地址,数组名加1,是移动一行元素。因此,二维数组名被称为行地址
*(a+1) 等同于 a[1] 此时这个星号,改变了指针的性质,二维数组a本来是行地址,加星号后降级成为了一个一级指针,从移动一行,变成移动一列
行指针(数组指针) :
存储行地址的指针变量,叫做指针变量,形式如下:
<存储类型> <数据类型> (*<指针变量名>)[表达式];
例如:int a[2][3]; int (*p)[3];
方括号中的常量表达式表示指针加1,移动几个数据 当用行指针操作二维数组时,表达式一般写成1行的元素个数,即列数