int*p ,b = 5;
p = &b;
в точности соответствует:
int b = 5;
int *p = &b;
p заканчивается указателем на int. Теперь верно, что этот код будет иметь почти такой же эффект на то, что заканчивается в p (хотя b имеет совершенно другой тип и значение), как это:
int b[1] = {5};
int *p = b; // or int *p = &b[0];
безусловно, в любом случае p указывает на int, которое вы можете рассматривать как простое int, или как первый (и единственный) элемент в одномерном массиве размера один. Итак, то, что следует, является законным и дает значимые результаты в обоих случаях:
printf("%d is stored at %p\n", *p, p);
printf("%d\n",p[0]);
но на этом сходство заканчивается.