鱼C论坛

 找回密码
 立即注册
查看: 1002|回复: 3

[已解决]带你学C带你飞-指针与二维数组-课后第4题

[复制链接]
发表于 2023-8-16 20:10:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        char array[2][3][5] = {
                {
                        {'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)这个也是为什么有这么多指针角标?
最佳答案
2023-8-16 20:12:02
在这段代码中,array是一个三维字符数组,它有两个维度、三行和五列。每个元素都是一个char类型的字符。

现在我们来解释一下代码中的每个部分:
*(*(*array + 1) + 2)

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

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

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

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

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

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

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

因此,打印语句 printf("%c%c%c%c\n", *(*(*array + 1) + 2), *(*(*(array + 1) + 1) + 2), ***array, *(**array + 1)); 的输出结果是 00xx
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-16 20:10:47 | 显示全部楼层
这段代码使用了一个三维数组来存储字符数据。三维数组可以看作是一个由多个二维数组组成的数组。在这个例子中, array 是一个由两个二维数组组成的数组。

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

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

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

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

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

因此, printf 语句输出的结果是"00xx"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 20:11:38 | 显示全部楼层
解答:

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

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

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

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

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

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

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

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-16 20:12:02 | 显示全部楼层    本楼为最佳答案   
在这段代码中,array是一个三维字符数组,它有两个维度、三行和五列。每个元素都是一个char类型的字符。

现在我们来解释一下代码中的每个部分:
*(*(*array + 1) + 2)

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

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

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

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

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

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

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

因此,打印语句 printf("%c%c%c%c\n", *(*(*array + 1) + 2), *(*(*(array + 1) + 1) + 2), ***array, *(**array + 1)); 的输出结果是 00xx
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 08:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表