5

我有这个问题:说起始地址是 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 行的解释意味着什么!请解释

4

3 回答 3

10

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

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

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

这是示意图

在此处输入图像描述

在第 2 行:

  • arr指向第三维的第一个元素,
  • *arr指向二维的第一个元素,
  • **arr指向第一维的第一个元素,
  • ***arr取一维的第一个元素的值。

从图中可以看出,所有维度都是从 address 开始的100。因此第 2 行的输出为:“100, 100, 100, 2”。

在第 3 行:

  • arr + 1指向第三维的第二个元素,
  • *arr + 1指向二维的第二个元素,
  • **arr + 1指向一维的第二个元素,
  • ***arr + 1取第一个维度的第一个元素的值并增加它。

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

于 2013-06-19T23:51:14.170 回答
2

你的答案是错误的。第 3 行的第一个值应该是 112,而不是 114。

当您对指针使用算术时,它会将地址更改一些元素(无论数组存储的大小)。当您像使用指针一样使用数组时,C 将为您管理它。

当您使用arr时,编译器会说您有一个指向包含两个类型元素的数组的指针int[3][2]。因此,向其中添加 1 意味着添加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
于 2013-06-19T23:08:46.793 回答
0

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

于 2013-06-19T23:31:31.253 回答