|
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]; 这两行代码又是什么意思?求解,谢谢。
首先,我们来解释一下这两行代码的含义:
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 中第二个二维数组 ...
|