在函数内传递数组

时间:2011-08-29 17:58:01

标签: c

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递增为数组?

3 个答案:

答案 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]