#include <stdio.h> void test_fuc(int b[][3]) { ++b; b[1][1]=820; } int main(void) { int a[][3]={ {1,2,3}, {4,5,6}, {7,8,9} }; test_fuc(a); printf("a[2][1]=%d ",a[2][1]); return 0; }
输出:
数组当做函数参数的时候,会退化成指针,但是只退化一次,int b[][3]作为参数会变成(*b)[3];b是一个指针,指向一个数组,数组含有3个int类型的元素。++b之后,注意我们b的类型,一旦移动一个步长,相当于移动3个int位置,所以++b之后,b指向的是a[1][0];然后b[1][1];相当于b又移动了1个步长,即移动3个int位相当于对应a[2]了,在b[1]的基础上,再使用[1],相当于对应a[2][1];所以最后打印a[2][1]等价于b[1][1].
平时我们习惯使用[]这样的下标运算代替指针运算,但是我们要清楚一个道理,b[1][1]等价于*(*(b+1)+1).