这就是一段炫技的垃圾代码,其之所以能够成立,是因为二维数组的地址空间是连续的
本题的二维数组逻辑上可表示为下图
又因为地址空间连续,也可以看作是很长的一维数组
题中数组指针p指向a[0][2],也就是数字3所在位置
输出 (*p)[i] 相当于把它当成了一维数组
数字3所在位置的地址作为一维数组的首地址
你可以把(*p)看作数组名,比如s,这样就是在输出s[0],s[1],s[2],即3,4,5
如果正常使用数组指针,输出(*p)[2]肯定越界了,但是二维数组地址空间是连续的,所以还能正常输出
输出 *p[i] 相当于把它当成了二维数组
每个p[i]都是一个行指针,因为数组指针定义为int (*p)[2],所以每列只有2个元素
那么p[0]指向第0行,p[1]指向第1行,p[2]指向第2行
根据运算符优先级规则,数组下标[]优先级更高,所以*p[i]实际上是*和p[i]
一维数组有下标形式 a[i] 和偏移量形式 *(a+i),二者是等价的,即 a[i] <==>*(a+i)
将*p[i]改写为偏移量形式: *p[i] <==> *(p[i]+0) <==> p[i][0]
此处将p[i]当做一个整体,代表行首地址,+0代表不偏移
所以*p[0]<==>p[0][0],*p[1]<==>p[1][0],*p[2]<==>p[2][0]
输出的就是行首元素3,5,7