关于指针的问题,如何解决?

最后的输出中q+i和*(q+i)分别指的是谁的地址
#include <stdio.h>
int main(){
    int *p,*q[5];
    int a[5];
    int i;
    for(i=0;i<5;i++)
        scanf("%d",&a[i]);
    p=a;
    for(i=0;i<5;i++)
        q[i]=&a[i];
    for(i=0;i<5;i++)
        printf("%d %d %d %d\n",*(p+i),**(q+i),*(q+i),q+i); 
    return 0; 
} 

img

q是一个int型长度为5的指针数组,q中的每个元素存放的是数组a每个元素的地址,q+i相当于&q[i],是这个指针数组下标为i的元素的地址,而*(q+i)则相当于q[i],是指针数组中下标为i的元素内存放的值,也就是a[i]的地址。
q是指针数组头,是地址常量,q+i可以理解为在q地址的基础上偏移i个int 类型的地址,而(q+i)则相当于取这个地址里面存放的值