declares a pointer p, which will be used to point at objects of type int *, ie, pointers to int. It doesn't allocate any storage, or point p at anything in particular yet.
int*p[1];
declares an array p of one pointer to int: p's type can decay to int ** when it's passed around, but unlike the first statement, p here has an initial value and some storage is set aside.
Re. the edited question on access syntax: yes, *p == p[0] == *(p+0) for all pointers and arrays.
Re. the comment asking about sizeof: it deals properly with arrays where it can see the declaration, so it gives the total storage size.
void foo(){//红色部分为差异int**ptr;int*array[10];sizeof(ptr);// just the size of the pointersizeof(array);// 10 * sizeof(int *)// popular idiom for getting count of elements in array:sizeof(array)/sizeof(array[0]);}// this would always discard the array size,// because the argument always decays to a pointer
size_t my_sizeof(int*p){returnsizeof(p);}
引申: 函数与指针也一样 /* function returning pointer to int */ 该函数返回整型指针 int *func(int a, float b); /* pointer to function returning int */指向函数的指针,该函数返回整型 int (*func)(int a, float b);