鱼C论坛

 找回密码
 立即注册
查看: 1152|回复: 2

[已解决]求助

[复制链接]
发表于 2023-4-27 15:25:16 | 显示全部楼层 |阅读模式
3鱼币

char a[4][3][2] = {
        {
                {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
        },
        {
                {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
        },
        {
                {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
        },
        {
                {'s', 't'}, {'u', 'v'}, {'w', 'x'}
        }
};
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = &a[1];
                                 //*pa 被定义为一个一维数组,其跨度为 2 个字节,所以 *(pa + 8) 指向的是 {'w', 'x'} 这个数组
                                                                                   //*ppa 被定义为一个二维数组,其跨度为 6 个字节,所以 *(ppa + 2) 指向的是 {{'s', 't'}, {'u', 'v'}, {'w', 'x'}} 这个二维数组

                                                                                    //    为什么*pa的跨度为两个字节,以及为什么*(pa + 8) 能指到 {'w', 'x'} 这个数组?
                                                                                     //       char (*pa)[2] = &a[1][0];
                                                                                      //     char (*ppa)[3][2] = &a[1];   这两行代码又是什么意思?求解,谢谢。
最佳答案
2023-4-27 15:25:17
首先,我们来解释一下这两行代码的含义:
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = &a[1];

`char (*pa)[2]` 定义了一个指向二维数组的指针,这个二维数组的大小是 [3][2]。`&a[1][0]` 取了三维数组 a 中第二个二维数组的第一个一维数组的地址。所以,pa 指向了这个地址。此时,pa 指向二维数组 `{{'g', 'h'}, {'i', 'j'}, {'k', 'l'}}`。

`char (*ppa)[3][2]` 定义了一个指向三维数组的指针,这个三维数组的大小是 [4][3][2]。`&a[1]` 取了三维数组 a 中第二个二维数组的地址。所以,ppa 指向了这个地址。此时,ppa 指向三维数组 `{{{'g', 'h'}, {'i', 'j'}, {'k', 'l'}}, {{'m', 'n'}, {'o', 'p'}, {'q', 'r'}}, {{'s', 't'}, {'u', 'v'}, {'w', 'x'}}}`。

接下来,我们来解释为什么 *pa 的跨度为两个字节。因为 pa 是指向二维数组 [3][2] 的指针,所以它的跨度是一维数组 [2] 的大小,即 2 个字节。每个字节存储一个字符。

现在我们来解释为什么 *(pa + 8) 能指向 {'w', 'x'} 这个数组。当我们给 pa 加上 8 时,由于它的跨度为 2 个字节,所以实际上我们跳过了 8 * 2 = 16 个字节。从 pa 指向的位置开始:

1. 跳过 {'g', 'h'},跳过 2 个字节
2. 跳过 {'i', 'j'},跳过 2 个字节
3. 跳过 {'k', 'l'},跳过 2 个字节
4. 跳过 {'m', 'n'},跳过 2 个字节
5. 跳过 {'o', 'p'},跳过 2 个字节
6. 跳过 {'q', 'r'},跳过 2 个字节
7. 跳过 {'s', 't'},跳过 2 个字节
8. 跳过 {'u', 'v'},跳过 2 个字节

总共跳过了 16 个字节,因此 *(pa + 8) 指向了 {'w', 'x'} 这个数组。

最佳答案

查看完整内容

首先,我们来解释一下这两行代码的含义: `char (*pa)[2]` 定义了一个指向二维数组的指针,这个二维数组的大小是 [3][2]。`&a[1][0]` 取了三维数组 a 中第二个二维数组的第一个一维数组的地址。所以,pa 指向了这个地址。此时,pa 指向二维数组 `{{'g', 'h'}, {'i', 'j'}, {'k', 'l'}}`。 `char (*ppa)[3][2]` 定义了一个指向三维数组的指针,这个三维数组的大小是 [4][3][2]。`&a[1]` 取了三维数组 a 中第二个二维数组 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-27 15:25:17 | 显示全部楼层    本楼为最佳答案   
首先,我们来解释一下这两行代码的含义:
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = &a[1];

`char (*pa)[2]` 定义了一个指向二维数组的指针,这个二维数组的大小是 [3][2]。`&a[1][0]` 取了三维数组 a 中第二个二维数组的第一个一维数组的地址。所以,pa 指向了这个地址。此时,pa 指向二维数组 `{{'g', 'h'}, {'i', 'j'}, {'k', 'l'}}`。

`char (*ppa)[3][2]` 定义了一个指向三维数组的指针,这个三维数组的大小是 [4][3][2]。`&a[1]` 取了三维数组 a 中第二个二维数组的地址。所以,ppa 指向了这个地址。此时,ppa 指向三维数组 `{{{'g', 'h'}, {'i', 'j'}, {'k', 'l'}}, {{'m', 'n'}, {'o', 'p'}, {'q', 'r'}}, {{'s', 't'}, {'u', 'v'}, {'w', 'x'}}}`。

接下来,我们来解释为什么 *pa 的跨度为两个字节。因为 pa 是指向二维数组 [3][2] 的指针,所以它的跨度是一维数组 [2] 的大小,即 2 个字节。每个字节存储一个字符。

现在我们来解释为什么 *(pa + 8) 能指向 {'w', 'x'} 这个数组。当我们给 pa 加上 8 时,由于它的跨度为 2 个字节,所以实际上我们跳过了 8 * 2 = 16 个字节。从 pa 指向的位置开始:

1. 跳过 {'g', 'h'},跳过 2 个字节
2. 跳过 {'i', 'j'},跳过 2 个字节
3. 跳过 {'k', 'l'},跳过 2 个字节
4. 跳过 {'m', 'n'},跳过 2 个字节
5. 跳过 {'o', 'p'},跳过 2 个字节
6. 跳过 {'q', 'r'},跳过 2 个字节
7. 跳过 {'s', 't'},跳过 2 个字节
8. 跳过 {'u', 'v'},跳过 2 个字节

总共跳过了 16 个字节,因此 *(pa + 8) 指向了 {'w', 'x'} 这个数组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-27 15:47:45 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-4-27 15:49 编辑
 //*pa 被定义为一个一维数组,其跨度为 2 个字节,所以 *(pa + 8) 指向的是 {'w', 'x'} 这个数组

pa不是数组, 它是一个数组指针, 指向一个char [2] 的数组, pa每加一个1, 就要跨过两个char , 所以跨度为2个字节.
char (*pa)[2] = &a[1][0];   pa初始值指到了 a[1][0][0]这个位置, 就是字符 'g', pa+8, 地址就要往后跳8x2=16个位置, 来到了字符 'w' 
ppa同理, 只是它是一个二维数组的指针 
后面有请CHATGPT出场
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 21:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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