所想如期而遇 发表于 2023-4-27 15:25:16

求助



char a = {
      {
                {'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) = &a;
char (*ppa) = &a;                                 //*pa 被定义为一个一维数组,其跨度为 2 个字节,所以 *(pa + 8) 指向的是 {'w', 'x'} 这个数组
                                                                                 //*ppa 被定义为一个二维数组,其跨度为 6 个字节,所以 *(ppa + 2) 指向的是 {{'s', 't'}, {'u', 'v'}, {'w', 'x'}} 这个二维数组

                                                                                    //    为什么*pa的跨度为两个字节,以及为什么*(pa + 8) 能指到 {'w', 'x'} 这个数组?
                                                                                     //       char (*pa) = &a;
                                                                                    //   char (*ppa) = &a;   这两行代码又是什么意思?求解,谢谢。

isdkz 发表于 2023-4-27 15:25:17

首先,我们来解释一下这两行代码的含义:

char (*pa) = &a;
char (*ppa) = &a;


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

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

接下来,我们来解释为什么 *pa 的跨度为两个字节。因为 pa 是指向二维数组 的指针,所以它的跨度是一维数组 的大小,即 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'} 这个数组。

两手空空儿 发表于 2023-4-27 15:47:45

本帖最后由 两手空空儿 于 2023-4-27 15:49 编辑

//*pa 被定义为一个一维数组,其跨度为 2 个字节,所以 *(pa + 8) 指向的是 {'w', 'x'} 这个数组

pa不是数组, 它是一个数组指针, 指向一个char 的数组, pa每加一个1, 就要跨过两个char , 所以跨度为2个字节.
char (*pa) = &a;   pa初始值指到了 a这个位置, 就是字符 'g', pa+8, 地址就要往后跳8x2=16个位置, 来到了字符 'w'
ppa同理, 只是它是一个二维数组的指针
后面有请CHATGPT出场
页: [1]
查看完整版本: 求助