如果 2D 数组不是双指针,那么为什么会发生这种情况?
If a 2D array is not a double pointer , then why does this happen?
#include <stdio.h>
int main()
{
int arr[3][4] = {
{ 10, 11, 12, 13 },
{ 20, 21, 22, 23 },
{ 30, 31, 32, 33 }
};
printf("%u, %u", arr, *arr) // Output - 1875181168, 1875181168
}
假设任何2D数组(arr)不是双指针,那么为什么arr和*arr引用相同的地址?
如果我们在纸上"绘制"数组arr
,它将看起来像这样
+-----------+-----------+-----------+-----------+-----------+-----+ |到达[0][0] |到达[0][1] |到达[0][2] |到达[0][3] |到达[1][0] |... | +-----------+-----------+-----------+-----------+-----------+-----+从
这里应该很容易看出,指向数组、数组的第一个元素和第一个元素的第一个子元素的指针都是相同的。
也就是说,&arr == &arr[0]
和&arr[0] == &arr[0][0]
(这当然意味着&arr == &arr[0][0]
)。
这里的区别在于类型:
&arr
属于int (*)[3][4]
类型&arr[0]
属于int (*)[4]
类型&arr[0][0]
属于int *
类型
现在至于arr
和*arr
,你必须记住,数组自然衰减到指向它们的第一个元素的指针。这意味着arr
将等于&arr[0]
.取消引用指针将是指向的"值",因此*arr
等于*(&arr[0]
),然后等于arr[0]
反过来将衰减到&arr[0][0]
。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 为什么这个音频包络不能通过开关的情况?
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 为什么这种情况发生在CodeBlocks上?
- 为什么这个递归没有得到它的基本情况?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 为什么在这种情况下递增阵列名称有效?
- 为什么在这种情况下我需要 .template
- 为什么它在不分配内存的情况下工作正常
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 为什么在以下情况下我需要使用 std::d ecay?
- 为什么在这种情况下 x = 44?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 为什么 lambda nullptr 取消引用在这种情况下有效?