努力学C的阿通 发表于 2023-8-16 20:10:34

带你学C带你飞-指针与二维数组-课后第4题

#include <stdio.h>

int main()
{
      char array = {
                {
                        {'x', 'x', 'x', 'x', 'x'},
                        {'x', 'x', 'o', 'x', 'x'},
                        {'x', 'x', 'x', 'x', 'x'}
                },
                {
                        {'x', 'x', 'x', 'x', 'x'},
                        {'x', 'x', 'o', 'x', 'x'},
                        {'x', 'x', 'x', 'x', 'x'}
                }
      };

      printf("%c%c%c%c\n", *(*(*array + 1) + 2), *(*(*(array + 1) + 1) + 2), ***array, *(**array + 1));

      return 0;
}

答案是00xx,我之前接触的array[][]只有2个角标,为什么这段有3个角标?与此同时,*(*(*(array + 1) + 1) + 2)是什么意思?***array这个为什么要有这么多指针角标?*(**array + 1)这个也是为什么有这么多指针角标?

isdkz 发表于 2023-8-16 20:10:47

这段代码使用了一个三维数组来存储字符数据。三维数组可以看作是一个由多个二维数组组成的数组。在这个例子中, array 是一个由两个二维数组组成的数组。

array 表示一个包含两个二维数组的数组,每个二维数组有3行5列。

*(*(*array + 1) + 2) 的意思是取 array 数组中第一个二维数组的第二行的第三个元素,即'o'。

*(*(*(array + 1) + 1) + 2) 的意思是取 array 数组中第二个二维数组的第二行的第三个元素,即'o'。

***array 的意思是取 array 数组中第一个二维数组的第一行的第一个元素,即'x'。

*(**array + 1) 的意思是取 array 数组中第一个二维数组的第一行的第二个元素,即'x'。

因此, printf 语句输出的结果是"00xx"。

学习编程中的Ben 发表于 2023-8-16 20:11:38

解答:

在这段代码中,array是一个二维数组,它有三个维度,分别是2、3和5。因此,我们可以通过三个角标来访问数组中的元素。

下面解释一下每个指针角标的含义:

1. *(*(*array + 1) + 2):首先,array本身就是一个指向二维数组的指针。*array表示取这个指针指向的二维数组的第一个维度,即array。接着,*(*array + 1)表示取array中的第二个维度,即array。最后,*(*(*array + 1) + 2)表示取array中的第三个维度,即array。所以,*(*(*array + 1) + 2)的值为'o'。

2. *(*(*(array + 1) + 1) + 2):*(array + 1)表示取array中的第二个维度,即array。*(*(array + 1) + 1)表示取array中的第二个维度,即array。最后,*(*(*(array + 1) + 1) + 2)表示取array中的第三个维度,即array。所以,*(*(*(array + 1) + 1) + 2)的值为'o'。

3. *array:*array表示取array中的第一个维度,即array。由于array是一个字符数组,所以*array表示取array的第一个元素,即array。所以,*array的值为'x'。

4. *(array + 1):首先,array表示取array中的第一个维度,即array。而*(*array + 1)表示取array中的第二个维度,即array。最后,*(array + 1)表示取array的第一个元素,即array。所以,*(array + 1)的值为'x'。

根据上面的解释,代码输出的结果应该是"00xx"。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-8-16 20:12:02

在这段代码中,array是一个三维字符数组,它有两个维度、三行和五列。每个元素都是一个char类型的字符。

现在我们来解释一下代码中的每个部分:

*(*(*array + 1) + 2)


首先,array是一个指向三维字符数组的指针。解引用array一次得到二维字符数组array。再次解引用得到一维字符数组array。最后,第三次解引用得到字符array,这个字符是'x'。

类似地,*(*(*(array + 1) + 1) + 2)解析如下:

· array + 1表示偏移一个单位,指向array。
· *(array + 1)解引用得到array,也就是二维字符数组中的第二行。
· *(array + 1) + 1表示二维字符数组中的第二行偏移一个单位,指向array。
· *(*(array + 1) + 1)解引用得到array,也就是字符'o'。
· *(*(array + 1) + 1) + 2表示字符'o'偏移两个单位,指向字符'x'。

另外,***array解析如下:

· *array表示指向三维字符数组中的第一个二维字符数组的指针,也就是array。
· **array解引用得到第一个二维字符数组的第一行,也就是array。
· ***array解引用得到第一个二维字符数组的第一行的第一个字符,也就是字符'x'。

最后,*(**array + 1)解析如下:

· **array表示指向第一个二维字符数组的第一行的指针,也就是array。
· *(**array + 1)解引用得到第一个二维字符数组的第一行的第二个字符,也就是字符'x'。

因此,打印语句 printf("%c%c%c%c\n", *(*(*array + 1) + 2), *(*(*(array + 1) + 1) + 2), ***array, *(**array + 1)); 的输出结果是 00xx。
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: 带你学C带你飞-指针与二维数组-课后第4题