C指针问题。。。。。。。

请问这个为什么是7呢
图片说明

做个简单的试验
这段代码编译出来之后翻译成汇编main函数变成如下
#include
int a[4][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int main()
{
int (*ptr)[2] = a;
(ptr + 1)[2] = 0;
return 0;
}
按照数组内存分布,我们姑且认为1的地址是4,之后都以4累加,那么对应数字的地址是x * 4
000084e4 :
main():
84e4: e52db004 push {fp} ; (str fp, [sp, #-4]!)
84e8: e28db000 add fp, sp, #0
84ec: e24dd00c sub sp, sp, #12
84f0: e59f3024 ldr r3, [pc, #36] ; 851c
84f4: e50b3008 str r3, [fp, #-8]
84f8: e51b3008 ldr r3, [fp, #-8]
84fc: e2833018 add r3, r3, #24
8500: e3a02000 mov r2, #0
8504: e5832000 str r2, [r3]
8508: e3a03000 mov r3, #0
850c: e1a00003 mov r0, r3
8510: e28bd000 add sp, fp, #0
8514: e8bd0800 ldmfd sp!, {fp}
8518: e12fff1e bx lr
851c: 00010730 .word 0x00010730
注意中间的add r3, r3, #24其中R3就是数组的首地址之前假定为4,那么这个时候算出来r3 = 4 + 24 = 28地址28就是数字7,实际上编译器所
做的就是将ptr + 1 + 2,每一次加2个单位(实际上就是定义ptr的步长)共8字节一共24个字节。
假如现在将代码改成 int (*ptr)[3] = a,其余都不变那么结果是多少呢?
同理,结果仍然是prt + 1 + 2 每次加3个单位共12个字节也就是36个字节,所以算出来结果是4+36 = 40所以结果是10
总结:
对于数组指针,他的本质是一个指针,只是大小是定义时候的一个数组,所以对一个指针进行加1操作,就是加上这个数组的大小,对这个数组指针进行[2]偏移操作,也相当于是 + 1操作,如果是二维数组,那么就是指向下一个一维数组的首地址,如果要遍历这个数组,那么就需要对这个首地址继续 + x并且指针引用,比如说
(ptr+ 1)[2]代表数组第4行(7, 8)如果要取值8就需要 (ptr + 1)[2] + 1),不知是否说明白

等等,我先把图片保存一下看看

刚才调试了下看了地址得到的表面理解,但是不知道对不对,请大神们指正:
1.如何取值取决于指针,*(ptr+1)要以2列为标准,而比如*(a+1)就要以3列为标准计算
2.(ptr+1)[2]中的[2]部分仍是行控制,表示在ptr向下+1行后再向下+2行
3.(ptr+1)[2]+1中的+1部分才是列控制,表示在此行向右移动一列

看图,不懂再私信我~再看看关于数组指针方面和二维数组方面的概念图片