使用数组和指针时,了解类型衰减如何发生非常重要。虽然您可能期望二维数组退化为双指针,但情况并非总是如此。让我们深入研究为什么会发生这种情况,并探索行为上的差异。
正如测试用例所示,一维数组确实衰变成单个指针:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
这是因为可以使用单个指针执行指针算术。
但是,二维数组不会衰变为双指针:
<code class="cpp">std::is_same<int**, std::decay<int[][1]>::type>::value; // false</code>
原因是双指针需要有关数组维度的附加信息。例如,在 int[5][4] 的情况下,编译器知道每个“内部”数组的长度为 4。转换为 int (*)[4] 会保留此信息,从而使指针算术成为可能。
但是,转换为 int ** 会丢失此维度信息。它只是一个指向指针的指针,这不足以执行有意义的指针算术。
考虑以下内容:
<code class="cpp">char *tmp = (char *)p // Work in units of bytes (char) + i * sizeof(int[4]) // Offset for outer dimension (int[4] is a type) + j * sizeof(int); // Offset for inner dimension int a = *(int *)tmp; // Back to the contained type, and dereference</code>
这段代码手动执行数组访问,表明编译器依赖维度信息。 int** 不提供此信息,因此不适合指针算术。
虽然一维数组会衰减为单指针,但多维数组不会衰减为双指针因为他们缺乏必要的尺寸信息。此行为确保使用单维指针仍然可以进行有意义的指针算术。
以上是为什么多维数组衰减到指针的方式与单维数组不同?的详细内容。更多信息请关注PHP中文网其他相关文章!