int f(int b[][3]);
int main()
{
int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
f(a);
printf("%d\n", a[2][1]);
}
int f(int b[][3])
{
++b;
b[1][1] = 1;
}
二维数组3x3 => 9
中包含的 a
个元素。传递后,b
将包含a
的基地址。如果假设基地址为1000
,那么++b
如何前往3个地点而不是9个地点?当变量a
仅作为三个元素传递给b[][3]
时,我们是否在进行类型转换?
b[1][1]
如何与8
而非5
的地址相对应?
我们不能在数组中递增或递减,因为数组是const
指针,但它们如何将++b
递增为数组?
答案 0 :(得分:5)
功能标题
int f(int b[][3])
只是一种令人困惑的写作方式(完全等同于)
int f(int (*b)[3])
b
的类型是“指向int
的三元素数组的指针”。当您递增b
参数时,将其调整为指向int
的下一个三元素数组 - 现在它指向{4,5,6}
。然后b[1]
再次索引并为您提供数组{7,8,9}
,最后b[1][1]
为您提供该数组的oneth元素,即8
。
答案 1 :(得分:0)
C多维数组实际上是线性的,除了有合成糖来正确地进行算术运算。
所以使用b[][3]
,它会超越一维数组并隐式翻译b[i][j] --> b[3*i+j]
++b
的工作原理如下:(++b)[i][j] = ORIGINAL_b[i+1][j]
。因此,在您的情况下,您正在访问ORIGINAL_b[1+1][1] = ORIGINAL_b[2*3+1] = ORIGINAL_b[7]
(第8个元素)
注意:这与动态malloc版本形成鲜明对比(在**b
中,b
是一个指针数组)
答案 2 :(得分:-1)
b [1] [1]如何对应于8的地址而不是5的地址?
这是预期的行为:
int f(int b[][3])
{
//at this point b[0][0] is 1, b[1][1] is 5
++b;
//now b[0][0] is 4, b[1][1] is 8
b[1][1]=1;
}
指针已递增以指向下一个内存插槽,即数组a
的第二个插槽。基本上是:
b -> a[0]
++b -> a[1]