用多维数组名作为指针

就像一维数组的名字可以用作指针一样,无论数组的维度是多少都可以采用任意数组的名字作为指针。但是,需要特别小心。思考下列数组:

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 *(编译器转换后),所以这一次调用将正确地执行。

posted @ 2022-12-02 11:15  木凌云  阅读(83)  评论(0)    收藏  举报