将n+1维数组用作n维数组参数的C语言方法

3
我的问题是,当你有一个数组tab[a][b][c]时,你能否将tab[a]用作参数array[b][c]
这里有一个例子:
void function(int tab[5][6])
{
    tab[4][3]++;
}

int main()
{
    int tab[9][5][6];
    for (int i=0;i<9;i++)
    {
        function(tab[i]);
    }
    return 0;
}

1
MSVC“让我”可以这样做,但我不知道它是否严格合法。请注意,由于对未初始化数据进行操作tab[4][3]++;,您的用法具有未定义行为 - Weather Vane
3
由于表达式 tab[i] 没有使用 &sizeof_Alignof 运算符来操作数组,因此该表达式被转换为指向数组第一个元素的指针。由于function原型中的int tab[5][6] 被调整为类型int(*)[6],参数和参数类型匹配。唯一的问题是 @WeatherVane 提到的读取未初始化的值。 - EOF
1个回答

2
当你有一个数组tab[a][b][c]时,你能否将tab[a]作为参数array[b][c]使用?
可以。
int tab[9][5][6];是类型为int的数组9个,每个数组包含5个数组,每个数组包含6个int。 tab[i]是类型为5个包含6个int的数组
当代码调用function(tab[i])时,tab[i]被转换为第一个元素的地址。在这种情况下,它是&tab[i][0],这是类型为指向6个int的数组的指针void function(int tab[5][6])void function(int (*tab)[6])相同。也就是说,该函数期望一个指向6个int的数组的指针。其中的5是给开发人员的建议,但对代码没有实用功能。
好:函数调用提供了预期的类型。 tab[4][3]++;操作tab[4][3]。其中的4表示使用int (*tab)[6]的第四个索引元素(从0开始)。幸运的是,这可以工作,因为调用代码的数组足够大以处理索引4。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接