c语言中的数组指针的疑问

问题遇到的现象和发生背景

既然*p是指向了数组的地址,打印为什么需要*(*p)呢?为什么*(*p)==(*p)[i]
(p)[i]可以理解,*(p)我不理解

问题相关代码,请勿粘贴截图

#include <stdio.h>
#include <stdio.h>
int main()
{
int temp[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &temp;
int i;

for(i = 0; i < 5; i++)
{
    printf("%d\n", *(*p + i));
    //或者 printf("%d\n", (*p)[i]);
 } 
 return 0;

}

望各位解答

*(*p)就是取地址里面的内容

int *p[5],首先它是一个数组,它的大小是5,它里面存放的数据类型是int *,也就是整型指针。 所以它叫指针数组、 (从右向左解析这个表示)
int (*p)[5],首先p是一个指针,指向大小为5的数组,因此这叫数组指针。(括号优先)
而 *p是指向了数组的首地址,所以 *p就是第一个元素temp[0]的地址,为&temp[0]或者temp ,再因为数组是连续的空间, *p+1就是&temp[1],而 *(*p+1)就是取地址里面的值

你可以打印 printf("%d\n", (*p + i));出来看看,地址就是依次往后移动一个int的大小,也就是4个字节,int就是占4个字节
同时也可以对比数组和指针的地址

for(i = 0; i < 5; i++)
{
    printf("%d\n", &temp[i]);
 } 
for(i = 0; i < 5; i++)
{
    printf("%d\n", (*p + i));
 }