下面这一小段程序,谁能帮忙解释一下~

 #include<stdio.h>
int main()
{
        int arr[]={1,2,3,4,5};
        int *p=arr;//                         
        printf("%d",arr[2]);//
        printf("%d",*(arr+2));//                
        printf("%d",p[2]);//p+0~p+4可以表示数组元素的地址,但是这里p[2]是什么用法?
        printf("%d",*(p+2));//
        *(p+2)+=3;//这里是先计算*(p+2)指向arr[2],再计算arr[2]+=3吗?
        printf("%d",*(p+2));//
}



 #include<stdio.h> // 没有添加头文件stdio.h
int main()
{
    int arr[]={1,2,3,4,5};
    int *p;
    p=arr;//  arr为数组指针,所以不能直接int p = arr;
    printf("%d\n",arr[2]);// 打印出arr数组的第三个值(从0开始计算)
    printf("%d\n",(arr+2));// 输出存放arr[2]的位置。
    printf("%d\n",p[2]);// p也为数组指针,所以输出p[2]和输出arr[2]是一样的值
    printf("%d\n",*(p+2));// p+2表示找到p指针之后的第三个值的位置,然后前面加个*号就是输出该位置的值
    (p+2)+=3;// 此处报错,不知道你要表达什么意思,左值必须是有效的。
    printf("%d\n",(p+2)); //输出指针位置 
}

#include
int main()
{
int arr[]={1,2,3,4,5};
int p=arr;//
printf("%d",arr[2]);//
printf("%d",
(arr+2));//
printf("%d",p[2]);//
printf("%d",*(p+2));//
(p+2)+=3;//
printf("%d",
(p+2));
}