c/c++:二维数组变量下标
c/c++ : 2-D array variable subscript
int a[3][3]={5};
printf("&a = %u n a = %u n*a = %un&a[0][0]=%dna[0][0]", &a, a, *a, &a[0][0], a[0][0]);
输出: -
&a = 2359028
a = 2359028
*a = 2359028
&a[0][0]=2359028
a[0][0] =5
这些怎么可能都一样呢?如果a的值=2359028,那么*a
不应该在地址2359028处给出值,即5吗?
-
&a
给出了数组的地址。它是int (*)[3][3]
型的。容易。 -
a
表示数组本身,并将进行数组到指针的转换,成为指向数组第一个元素的指针。该数组的第一个元素是int[3]
类型的子数组,因此得到指向该子数组的指针。这个指针的类型是int (*)[3]
。因为第一个子数组位于数组的开头,所以它的地址与前面相同。 -
对于
*a
,数组再次进行数组到指针的转换,以获得与之前相同的指向子数组的指针。然后将其解引用以获得子数组本身。然后,表示子数组的表达式也进行数组到指针的转换,为您提供指向其第一个元素的指针。第一个元素的类型是int
,因此指针的类型是int*
。第一个元素的地址与它所在的子数组的地址相同,正如我们所看到的,子数组的地址与整个数组的地址相同。 -
&a[0][0]
首先获得第一个子数组的第一个元素,然后获取它的地址。这将为您提供与前一点完全相同的指针
因此,所有这些指针具有相同的值。
概略地:
0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
└─────────────────────────────────────────────────────┘
&a points at the entire array
└─────────────────┘
a gives you a pointer to the first subarray
└─────┘
*a gives you a pointer to the element 0,0
and so does &a[0][0]
这些区域都从相同的地址开始,所以指针具有相同的值。
在C语言中,当数组涉及到表达式时(例如当传递给函数或指针算术时),它被隐式地转换为指针。因为您将a
传递给printf
,它被隐式转换为指向a
的指针,这与&a
相同。
您可能会感到困惑的是,*a
看起来像一个相对于&a
的双解引用,它返回数组的地址,所以*a
应该在这个逻辑上得到a[0][0]
的值。但事实并非如此。
"…"地址2359028的值不应该是5吗?"
是和不是。*a
确实应该在地址a
上给您对象。但是,在您的示例中,a
的类型是int[3][3]
。这意味着在这个间接层次上,地址a
的对象(如果我们将a
解释为指针)不是您错误地认为的5
,它实际上是整个1D数组a[0]
。*a
的类型是int [3]
,存储在*a
的值同样是整个1D子数组a[0]
。
因此,当您尝试printf
*a
时,您实际上指定了整个a[0]
子数组作为参数。该子数组衰减为指向相同位置的指针(因为整个数组a
和它的第一个子数组a[0]
在内存中具有相同的位置)。这就是为什么将a
和*a
(以及&a
)打印为指针会输出相同的数值的原因。
在这种情况下,如果您想访问5
,则必须执行**a
。仅*a
是不够的。
- 尝试通过多个向量访问变量时,向量下标超出范围
- 矢量下标超出SFML游戏中的范围
- 如何在C++程序中使用下标数字?
- 一组值的零开销下标运算符
- 运行时错误:矢量下标超出范围:正在检查空集
- 如何重载下标运算符 [] 以引用 2d STL 数组?
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 矢量无效下标.SFML
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 编译期间矢量下标超出范围
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 有没有办法检查发送到变量的值是否是正确的类型,而它已经在该变量下?
- 在继承的模板类中使用下标 [] 运算符
- 对矢量来说是全新的.矢量下标超出范围
- 运算符重载多个任务的下标和赋值运算符
- 为什么函数的任何索引处的下标运算符在C++中总是返回1
- 具有std::map成员变量的类的下标运算符
- c/c++:二维数组变量下标
- 下标运算符接受变量类型的可变长度参数