此代码正确吗?是否出于某些原因不赞成将二维数组用作一维数组?

char tab1[3][3];

for(int i = 0; i < 3; i++)
    for(int j = 0; j < 3; j++)
       tab1[i][j] = (char)i;

printf("%c", ((char*)tab1)[3]); // == tab1[1][0]

最佳答案

如果没有其他原因,这很好,因为char可以根据标准对所有其他类型进行别名。多维数组也被分配为连续块,因此它是内存中的一维数组。

我们知道tab1会衰减到指向连续多维数组(它是数组)的第一个元素的指针,并且将该数组指针强制转换为char*(可以别名任何东西)必须很好。

如有疑问,您可以随时执行&tab1[0][0]。同样,因为我们知道分配的内存是连续的。

编辑

如果这是一个整数数组(int tab1[3][3]),那么情况就有些不同了。据我所知,在C++17之前,该标准指出,指向正确对象类型的指针是有效的,无论其如何获取其值。这意味着强制转换为int*应该很好,因为我们知道tab1产生的地址与第一个元素的地址相同。

但是,已删除保证的 C++17之后的,因此此强制转换可能是未定义的行为。

See THIS question了解更多详细信息。

因此,我总是建议使用&tab1[0][0],它将始终有效。

09-30 13:28
查看更多