这笔记怎么理解?(难)

  1. 定义以下变量:


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 和 ppa 访问数组 a 中的 'x' 元素,请问表达式应该怎么写?

答:*((pa+8)+1) 和 (((ppa+2)+2)+1))。
解析:

img

如上图所示,*pa 被定义为一个一维数组,其跨度为 2 个字节,所以 (pa + 8) 指向的是 {'w', 'x'} 这个数组,所以 ((pa + 8) + 1) 取出 'x' 元素;ppa 被定义为一个二维数组,其跨度为 6 个字节,所以 (ppa + 2) 指向的是 {{'s', 't'}, {'u', 'v'}, {'w', 'x'}} 这个二维数组,所以 (((ppa + 2) +

换个方式看!

img

定义的数组 是从点线面依次增加 二维就是行列 三维就是块行列
四维就是区块行列 依次类推

而a已经定义成了一个三维函数 下面使用下标的赋值的时候
a[n]如果哪怕是这样只有一个下标 那么这个下标代表定义a数组的最大那个区域 即最左边 此题a[n]一个下标就代表n块
a[n][m]代表n块的那m行 a[n][m][l]代表n块的那m行的l列那个元素!

//这里的指向应也要正确 比如
char (*pa)[2] = &a[1][0]; 指针数组pa 2个元素指向的a[1][0]第2块第1行刚好是2个元素!
char (*ppa)[3][2] = &a[1];指针数组ppa 3行2列 6个元素 指向的a[1]第2块 刚好6个元素

(虽然这里a[1]的第2块也是3行2列 但是我认为只要元素个数相等,就能正确指向 如果指向一个2行3列我认为也是能通过编译的 因为任何多维数组都是一维数组的排列 只是方便程序员理解 代码如下)

img

结果超出意料 难道定义多少列 多少行 多少块的数组赋值的数组块行列必须要一致?

img

虽然编译出现了warring 但是好像结果也没太大问题 有一点点小问题 想用打印第一块的方式打印出来
会打印到整个数组 b[0]的地址也是数组b整体的地址 所以用
b[0]来打印第一块 是做不到的

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

正常知道二维数组就行了,二维以上没必要浪费时间看。