接着昨天的继续讲多维数组,一维数组名的值是一个指针常量,它的类型是“指向元素类型的指针”,它指向数组的第一个元素。多维数组也差不多简单。唯一的区别是多维数组第1维的元素实际上是另一个数组。例如下面这个声明;
int matrix[3][10];
创建了matrix,它可以看做是一个一维数组,包含3个元素,只是每个元素恰好是10个整型元素的数组。matrix这个名字的值是一个指向它第一个元素的指针,所以matrix是一个指向一个包含10个整型元素的数组的指针。
指向数组的指针:
下面这些声明合法吗?
int vector[10],*vp = vector;
int matrix[3][10], *mp = matrix;
第一个声明时合法的,它为一个整型数组分配内存,并且把vp声明称一个指向整型的指针,并把它初始化为指向vector数组的第一个元素。vector和vp具有相同的类型:指向整型的指针。但是,第二个声明时非法的。它正确地创建了martix数组,并把mp声明为一个指向整型的指针。但是mp的初始化不正确,因为matrix并不是一个指向整型的指针,而是一个指向整型数组的指针。我们应该怎样声明一个指向整型数组的指针呢?
int (*p)[10]
这个声明比我们以前见过的所有声明都复杂,但他事实上并不是很难。你只要假设它是一个表达式并对它求值。下标引用的优先级高于间接访问,但由于括号的存在,首先执行的还是间接访问。所以,p是个指针,但它指向什么呢?
声明并没有直接告诉你p是什么,但推断他的类型并不困难——当我们对它执行间接访问操作时,我们得到的是个数组,是该数组进行下标引用操作得到的一