这段代码合适吗?由于某种原因,使用2维数组作为1维弃用了吗?
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]
Run Code Online (Sandbox Code Playgroud)
Gal*_*lik -1
如果没有其他原因,这很好,因为char可以根据标准为所有其他类型别名。也是多维的数组被分配为连续块,因此它首先是内存中的一维数组。
我们知道,tab1衰减为指向连续多维数组(这是一个数组)的第一个元素的指针,并将该数组指针转换为char*(可以为任何别名)一定没问题。
如果有疑问,您可以随时这样做&tab1[0][0]。再次因为我们知道分配的内存是连续的。
编辑
如果这是一个整数数组 ( int tab1[3][3]) 那么情况就有点不同了。据我了解,标准之前指出,指向正确对象类型的指针是有效的, 无论它如何获取其值。这意味着强制转换应该没问题,因为我们知道由C++17int*tab1与第一个元素的地址相同。
然而,在该保证被删除之后,因此这种强制转换可能是 未定义的行为。C++17
看到这个问题有关更多详细信息,
出于这个原因,我总是建议使用&tab1[0][0]它总是有效的。