C arr+的含义;1、*arr+;1、**arr+;三维阵列中的1

C arr+的含义;1、*arr+;1、**arr+;三维阵列中的1,c,arrays,C,Arrays,我有一个问题: 假设起始地址是100 int arr[2][3][2] = {{{2,4},{7,8},{3,4}},{{2,2},{2,3},{3,4}}}; printf(“%u %u %u %d \n”,arr,*arr,**arr,***arr); // Line 2 printf(“%u %u %u %d \n”,arr+1,*arr+1,**arr+1,***arr+1); // Line 3 } Answer: 100, 100, 100, 2 114, 104, 102, 3

我有一个问题: 假设起始地址是100

int arr[2][3][2] = {{{2,4},{7,8},{3,4}},{{2,2},{2,3},{3,4}}};
printf(“%u %u %u %d \n”,arr,*arr,**arr,***arr); // Line 2
printf(“%u %u %u %d \n”,arr+1,*arr+1,**arr+1,***arr+1); // Line 3
}
Answer:
100, 100, 100, 2
114, 104, 102, 3
说明:

对于第3行:
arr+1
在第三维中增加,因此指向值 在114处,
*a+1
在第二维度中递增,因此指向104,
**arr+1
增加第一个维度,从而指向102,
***arr+1
首先获得 值,然后将其递增1。因此是第二行的输出


我的问题——我已经尽力了。但我可以理解第三行的解释!请解释一下你的答案是错的。第3行的第一个值应该是112,而不是114

在指针上使用算术运算时,它会将地址更改一定数量的元素(数组存储的大小)。当您将数组当作指针使用时,C将为您管理它

当您使用
arr
时,编译器会说您有一个指向包含两个
int[3][2]
类型元素的数组的指针。因此,向其中添加一意味着添加
sizeof(int[3][2])
,即12。以下是一张表,显示了这一点:

code      element type   ints per element    bytes per element   array length
-----------------------------------------------------------------------------
arr       int[3][2]      6                   12                  2
*arr      int[2]         2                   4                   3
**arr     int            1                   2                   2

在您的示例中,任何“解释”都没有多大价值。看,你把事情搞混了。这是因为如果您使用C的malloc进行分配,那么您的multi--ing(**arr等)才是合理的。然后,2D数组的行是(int*)类型的arr[i],在任何行中,列值是(int*)类型的arr[i][j],整个2D矩阵是(int*)类型的*arr。在3D中,整个3D结构的arr[i][j][k]类型(int)一直到**arr。但是使用int-arr[2][3][2]={…},只需使用arr[i][j][k]获得矩阵元素,即arr[0],arr[1]用于行。指针对于那些编译时分配的2-3D矩阵不是很有用。始终记住**arr是指向指针的指针,当且仅当有人出现并执行所有C-malloc-ing时。关于,M.

什么是
int-arr[2][3][2]
?它是由2个元素组成的数组,类型为
int[3][2]
。这是三维空间

什么是
int[3][2]
?它是类型为
int[2]
的3个元素的数组。这是第二维度

什么是
int[2]
?它是由两个
int
类型的元素组成的数组。这是第一维度

这是图表

第2行:

  • arr
    指向第三维的第一个元素
  • *arr
    指向第二维度的第一个元素
  • **arr
    指向第一维度的第一个元素
  • ***arr
    取第一维度的第一个元素的值
从图中可以看出,所有维度都从地址
100
开始。因此第2行的输出为:“1001001002”

第3行:

  • arr+1
    指向三维的第二个元素
  • *arr+1
    指向第二维度的第二个元素
  • **arr+1
    指向第一维度的第二个元素
  • ***arr+1
    获取第一维度的第一个元素的值并将其递增

从图中可以看出,第三维的第二个元素有地址
112
(不是114!),第二维的第二个元素有地址
104
,第一维的第二个元素有地址
102
。因此,第3行的输出必须是:“112、104、102、3”

***arr
当我看到它时,我的眼睛和大脑会受到伤害。由于优先级的原因,
*arr+1
是存储在
arr
的值添加到数字1中。@Kevin在本例中,存储在
arr
的值的类型为
int[3][2]
。您不能将其添加到号码中1@kotlomoy
arr
衰减为一个指针,因此通过指针算法增加1;它实际上将值增加了>1,但它对指针
+1
是有效的。对不起,系统耗尽了我所有的星号,所以不要读它。在表格的帮助下进行了很好的解释