C语言的指针与多维数组( 四 )

前面介绍过,编译器会把数组表示法转换成指针表示法 。例如,编译器会把ar[1]转换成ar+1 。编译器对ar+1求值,要知道ar所指向的对象大小 。下面的声明:
int sum2(int ar[][4], int rows); // valid declaration表示ar指向一个内含4个int类型值的数组(在我们的系统中,ar指向的对象占16字节),所以ar+1的意思是“该地址加上16字节” 。如果第2对方括号是空的,编译器就不知道该怎样处理 。也可以在第1对方括号中写上大小,如下所示,但是编译器会忽略该值:
int sum2(int ar[3][4], int rows); // valid declaration, 3 ignored与使用typedef相比,这种形式方便得多:
typedef int arr4[4];// arr4 array of 4 inttypedef arr4 arr3x4[3];// arr3x4 array of 3 arr4int sum2(arr3x4 ar, int rows);// same as next declarationint sum2(int ar[3][4], int rows); // same as next declarationint sum2(int ar[][4], int rows);// standard form一般而言,声明一个指向N维数组的指针时,只能省略最左边方括号中的值
int sum4d(int ar[][12][20][30], int rows);因为第1对方括号只用于表明这是一个指针,而其他的方括号则用于描述指针所指向数据对象的类型 。下面的声明与该声明等价:
int sum4d(int (*ar)[12][20][30], int rows);// ar a pointer这里,ar指向一个12×20×30的int数组 。

【C语言的指针与多维数组】


推荐阅读