#include <stdio.h>
void foo(int[][3]);
int main(void)
{
int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
foo(a);
printf("%d\n", a[2][1]);
return 0;
}
void foo(int b[][3])
{
++b;
b[1][1] = 9;
}
gdb之后:
++b的步长实际上是3个int,也就是++b运算以后,b指向{4,5,6}这个数组的开始,而b[1]就是{7,8,9}, b[1][1]实际上就是8这个值也就是main函数中的a[2][1].
In foo
, b
has type pointer to array[3] ofint
, and after the increment, itpoints to the array
a[1]
({4, 5, 6}
). So b[1]
has type array[3] of
int
, and it denotes the arraya[2]
({7, 8, 9}
). In value context,b[1]
“decays” into a pointer toa[2][0]
(7), so
b[1][1]
denotesa[2][1]
, whose value is changed from 8 to 9.