C++ c/c++;:二维数组变量下标
输出:-C++ c/c++;:二维数组变量下标,c++,c,C++,C,输出:- int a[3][3]={5}; printf("&a = %u \n a = %u \n*a = %u\n&a[0][0]=%d\na[0][0]", &a, a, *a, &a[0][0], a[0][0]); 这些怎么都一样? 如果a的值=2359028,那么*a不应该在地址2359028处给出值,即5 &a提供数组的地址。它的类型是int(*)[3][3]。简单 a表示数组本身,并将进行数组到指针的转换,以成为指向数组第一个元素的指针。数组的第
int a[3][3]={5};
printf("&a = %u \n a = %u \n*a = %u\n&a[0][0]=%d\na[0][0]", &a, a, *a, &a[0][0], a[0][0]);
这些怎么都一样?
如果a的值=2359028,那么*a
不应该在地址2359028处给出值,即5
&a
提供数组的地址。它的类型是int(*)[3][3]
。简单a
表示数组本身,并将进行数组到指针的转换,以成为指向数组第一个元素的指针。数组的第一个元素是int[3]
类型的子数组,因此我们得到一个指向该子数组的指针。此指针的类型为int(*)[3]
。由于第一个子数组位于数组的开头,因此它的地址与以前相同*a
,数组再次进行数组到指针的转换,以获得与以前相同的指向子数组的指针。这就是解引用以获得子阵列本身。然后,这个表示子数组的表达式也会进行数组到指针的转换,为您提供指向其第一个元素的指针。第一个元素的类型为int
,因此指针的类型为int*
。第一个元素的地址与它所属的子数组的地址相同,正如我们所看到的,子数组的地址与整个数组的地址相同&a[0][0]
首先获取第一个子数组的第一个元素,然后获取它的地址。这将为您提供与上一点完全相同的指针&a = 2359028
a = 2359028
*a = 2359028
&a[0][0]=2359028
a[0][0] =5
这些区域都从相同的地址开始,因此指针具有相同的值
&a
提供数组的地址。它的类型是int(*)[3][3]
。简单a
表示数组本身,并将进行数组到指针的转换,以成为指向数组第一个元素的指针。数组的第一个元素是int[3]
类型的子数组,因此我们得到一个指向该子数组的指针。此指针的类型为int(*)[3]
。由于第一个子数组位于数组的开头,因此它的地址与以前相同*a
,数组再次进行数组到指针的转换,以获得与以前相同的指向子数组的指针。这就是解引用以获得子阵列本身。然后,这个表示子数组的表达式也会进行数组到指针的转换,为您提供指向其第一个元素的指针。第一个元素的类型为int
,因此指针的类型为int*
。第一个元素的地址与它所属的子数组的地址相同,正如我们所看到的,子数组的地址与整个数组的地址相同&a[0][0]
首先获取第一个子数组的第一个元素,然后获取它的地址。这将为您提供与上一点完全相同的指针&a = 2359028
a = 2359028
*a = 2359028
&a[0][0]=2359028
a[0][0] =5
这些区域都从相同的地址开始,因此指针具有相同的值。在C语言中,当一个数组包含在一个表达式中(例如,当传递给函数或指针算术时),它会隐式转换为指针。因为您正在将
a
传递给printf
,它被隐式转换为指向a
的指针,这与&a
相同
您可能会对以下事实感到困惑:
*a
看起来像是相对于&a
的双解引用,后者返回数组的地址,因此*a
应该根据此逻辑得到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
是不够的。“…不应该*在地址2359028即5处给出值吗?”
是和否。*a
确实应该给您地址a
处的对象。但是,在您的情况下,a
具有类型int[3][3]
。这意味着在这个间接层次上,地址a
处的对象(如果我们将a
解释为指针)不是您错误地认为的5
,它实际上是整个1D数组a[0]
。*a
的类型是int[3]