大一复习指针遇到的问题

p指向a[2][0]的地址,这里的*(p-2)指的是什么?这里p-2是指向哪里?


#include<stdio.h>
int main()
{
    int a[3][3]={{1},{4,5},{7,8,9}};
    int *p=a[2];
    printf("%d",*(p-2));
}

5
二维数组在内存中是一行一行顺序存储的, p指向a[2][0], 值为 7, p-2 指向 a[1][1],向前移动两位,值为 5
//形如: 1 0 0 4 5 0 7 8 9

int *p=a[2];
这行代码 p 指针指向了 二维数组的 a[2]也就是 {7,8,9}这个数组的首地址(注意数组从0开始计算下标)
而 *(p-2)将指针以 int数值类型向前(数组存储的地址连续)移动了2个单位(8字节,int占4个字节),指针指向了 a[1][2]的位置,也就是 5

p指向a[2][0],p-2当然指向的是a[2][0]往前数2个地址啊
如果横着看你看不懂,你把数组竖起来看,并把缺失的项目补齐

int a[3][3]={
{1,0,0},
{4,5,0},
{7,8,9}//a[2][0]是7,往前数2个不是5吗
};