指针与数组
C语言中只有一维数组,而数组的大小必须在编译期就确定,数组的 元素可以是任何类型的对象 当然可以是另外一个数组
对于一个数组,我们只能做两件事:确定数组大小以及获得指向该数组下标为0的元素的指针
int calendar[12][13];
对于这个代码块,这个表示为该数组有12个数组类型的元素,其中每个数组都是一个拥有31个整形元素的数组,因此sizeof(calendar)的值是372(12*13) 与sizeof(int)的乘积
所以
int *p;
p=calendar[4];//这个语句指向了数组calendar[4]中下标为0的元素
i=calendar[4][7];
i= *(calendar[4]+7);
i=*( *(calendar+4)+7);
//数组名是数组的首地址
p=calendar//错的因为p是整形指针,而calendar是数组calendar[0]的整个数组的指针
为了更好的理解我们引入一个一维数组
arr是首元素的地址,类型是int*。&arr是 整个数组的地址 ,类型是int(*)[5](指向含有5个元素的数组的指针)。
虽然它们在数值(内存编号)上是一样的,但在指针步长上完全不同。
arr + 1移动 4 字节,而&arr + 1会跳过整个数组。如果我们需要指向整个数组的指针,就要写
int (*ap)[31]