首页 >后端开发 >C++ >为什么多维数组衰减到指针的方式与单维数组不同?

为什么多维数组衰减到指针的方式与单维数组不同?

DDD
DDD原创
2024-10-26 08:24:03637浏览

 Why Do Multidimensional Arrays Decay to Pointers Differently Than Single-Dimensional Arrays?

为什么数组会根据维数不同地衰减为指针

简介

使用数组和指针时,了解类型衰减如何发生非常重要。虽然您可能期望二维数组退化为双指针,但情况并非总是如此。让我们深入研究为什么会发生这种情况,并探索行为上的差异。

一维数组的衰变

正如测试用例所示,一维数组确实衰变成单个指针:

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn