用多维数组名作为指针
就像一维数组的名字可以用作指针一样,无论数组的维度是多少都可以采用任意数组的名字作为指针。但是,需要特别小心。思考下列数组:
int a[NUM_ROWS][NUM_COLS]
a不是指向a[0][0]的指针,而是指向a[0]的指针。从C语言的观点来看,这样是有意义的。C语言认为a不是二维数组而是一维数组,且这个一维数组的每个元素又是一位数组。用作指针时,a的类型是int (*)[NUM_COLS](指向长度为NUM_COLS的整形数组的指针)。
了解a指向的是a[0]有助于简化处理二维数组元素的循环。例如,为了把数组a的第i列清零,可以用
for (p = &a[0]; p < &a + [NUM_ROWS]; p++)
(*p)[i] = 0;
取代
for (p = a; p < a + NUM_ROWS; p++)
(*p)[i] = 0;
另一种应用是巧妙地让函数把多维数组看成是一维数组。例如,思考如何使用find_largest函数找到二维数组a中的最大元素。
int find_largest(int a[], int n)
{
int i, max;
max = a[0];
for (i = 1; i < n; i++)
if (a[i] > max)
max = a[i];
return max;
}
我们把a(数组的地址)作为find_largest函数的第一个实际参数,NUM_ROWS * NUM_COLS(数组a中的元素总数量)作为第二个实际参数;
largest = find_largest(a, NUM_ROWS * NUM_COLS); // wrong
这条语句不能通过编译,因为a的类型为int (*)[NUM_COLS]而find_largest函数期望的实际参数类型是int *。正确的调用是:
largest = find_largest(a[0], NUM_ROWS * NUM_COLS);
a[0]指向第0行的元素0,类型为int *(编译器转换后),所以这一次调用将正确地执行。

浙公网安备 33010602011771号