为什么 地址是一样的 ,但是用指针指过去的时候所得的值 是不一样的.求大神解答

#include
#include
int Cool(int m)
{
int array[20];
int i,j;
int k=1;
int l=0;
for(i=0;m!=1;i++,k++)
{

    for(j=2;j<=m;j++)
    {
        if(m%j==0)
        {

            array[k]=j;

            m=m/j;

            break;
        }
    }

}
//************经过我调试的结果 ,下面的程序 测试如下,然而地址  对应不上 
l=k;
array[0]=l-1;
//printf("他一共有%d个元素:",array[0]-1); 

for(i=0;i<k;i++)
{
    printf("\n********************\n%d ",&array[i]);
}
return array;//我要将数组传回去 

}
//**************看看是否接受到了
int main()
{
int m,n,k=0;
int Array[20];
int p,*p1,o,o1;
int array[20];
int i,j,k1=0;
int sum = 1;
int MinSum=0;
printf("please input the two values:\n");
scanf("%d%d",&m,&n);
//
*****************分别用两个数组接收一下,来测试下吧
//**************
o=m;
o1=n;
//************第一次运行的时候发现是循环条件有了些问题

printf("\n***************\n");

//p=array;
p=Cool(m);
array[0]=*p;

printf("************ %d *****",p);


printf("there are have %d 个",&array[0]);

p++;
//*************************************//下面的这个部分有问题了 
for(i=0;i<array[0];i++,p++)
{
    printf("%d ",p);//首先可以证明的一点是指针一定是连续的. ..我输出了下地址证明的确是连续的 
} 

//*****************

//****************下面这个要求的是最大公约数
/*for(i=0;i<k;i++)
{

    for(j=i;j<k1;j++)
    {
        if(array[i]==array1[j])
        {
            sum=sum*array[i];break;
        }
    }
} 
//**************这个是最大公约数的结果 
printf("\n*********\n%d:",sum);

MinSum=(o*o1)/sum;

printf("\n*********\n%d:",MinSum);

//接下来 我要求最小公倍数了 */
return 0;

}//我们只讨论指针的问题

图片说明为什么地址一样的 *p++ 和 array[20]求解的结果却不同却不同?

*p++每次++只会移动一个元素的距离(是int的话就是4)怎么会和array[20]地址一样?
代码略难懂,有两点:
1.打印地址可以用%p来打印
2.你返回了一个局部数组变量的地址