此代码正确吗?是否出于某些原因不赞成将二维数组用作一维数组?
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]
,它将始终有效。