指针处理二维数组的行比较简单,但处理二维数组的列就没那么容易了,因为数组是按行而不是按列存储的。下面的循环对数组a
的第i
列清零:
int a[NUM_ROWS][NUM_COLS], (*p)[NUM_COLS], i;
for (p = &a[0]; p < &a[NUM_ROWS]; p++)
(*p)[i] = p;
这里把p
声明为指向长度为NUM_COLS
的整形数组的指针。在(*p)[NUM_COLS]
中,*p
是需要使用括号的;如果没有括号,编译器将认为p
是指针数组,而不是指向数组的指针。表达式p++
把移到下一行的开始位置。在表达式(*p)[i]
中,*p
代表a
的一整行,因此(*p)[i]
选中了该行第i列的那个元素。(*p)[i]
中的括号是必要的,因为编译器会将*p[i]
解释为*(p[i])
。