请教C语言中 二级指针括号内与括号外的区别

这是一个用二级指针对整数从小到大排序的程序。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{

    int a[7]={34,98,56,12,22,65,1};
    int *p[7],i,j,*t;
    for(i=0;i<7;i++)
        p[i]=&a[i];
    for(i=0;i<6;i++)//用冒泡排序
    {
        for(j=0;j<6-i;j++)
//现在以下if语句可以正常输出排序后结果。但修改为if(*(*p+j)>*(*p+j+1))输出的结果则没有排序
            if(**(p+j)>**(p+j+1))
                {
                    t=*(p+j);
                    *(p+j)=*(p+j+1);
                    *(p+j+1)=t;    
                }
    }    
    for(i=0;i<7;i++)    
        printf("% d",*p[i]);
     return 0;
}

这俩含义有什么区别吗?我用*(p+j)和*(p+j)单个输出数组一个数时候结果都是一样的,为什么排序的时候就不行了

后来输出了一下他们的地址,发现有的地址已经不是数组中的原地址,为什么还能输出..

img

int ** p[]和int * (* p)[]是不一样的
int ** p[]表示p是一个int * 数组, 每一个p[i]都是int * 指针,
int * ( * p)[]表示p是一个int数组, 但是这个int数组的命名, 地址都是未知, 可以灵活改变