多维数组中的类型衰减
在 C 中,数组在某些上下文中经历类型衰减为指针。但是,一维数组和多维数组的行为有所不同。为什么会这样?
一维数组
考虑以下代码:
<code class="cpp">int[] arr = {1, 2, 3};</code>
类型衰减将 int[] 转换为 int *,允许我们写:
<code class="cpp">std::is_same<int*, std::decay<int[]>::type>::value; // true</code>
这是因为 int[] 实际上衰减为指向数组第一个元素的指针。
多维数组
但是,此行为不会扩展到多维数组。考虑:
<code class="cpp">int[][1] arr2 = {{1}, {2}, {3}};</code>
类型衰减不会将 int[][1] 转换为 int**。相反,它仍然是 int[][1],它是一个指向大小为 1 的数组的指针。这是因为,由于多维数组的内存布局不连续,因此对其执行指针算术是不切实际的。
指向数组的指针
为了获得多维数组所需的指针类型,我们需要创建指向数组的指针。考虑:
<code class="cpp">int*[] arr3 = {arr, arr2};</code>
这会衰减为:
<code class="cpp">int**</code>
这是因为 int*[] 衰减为 int**,因为第一个维度是指针,第二个维度是array.
含义
理解这种行为对于将多维数组作为函数参数传递至关重要。需要指向指针的函数本身不能接受多维数组,但它们可以接受指向数组的指针,这些指针在参数传递期间会衰减为指向指针的指针。这种微妙的区别确保了指针算术的一致性并防止内存访问错误。
以上是为什么 C 中一维数组和多维数组的类型衰减不同?的详细内容。更多信息请关注PHP中文网其他相关文章!