Вам не «нужно»;Вы могли бы написать cin >> a[0]
.
Для встроенных типов и указателей и т. п. a[b]
- это *(a+b)
- *(b+a)
- b[a]
, и вы можете поменять их все.
Это только соглашение, которое ведет к выбору.Как обычно, если бы вы выделили более одного int
, вы бы использовали «нотацию массива» (a[i]
), а если бы вы выделили только один int
, вы бы использовали прямую разыменование (*(a+0)
)или *a
).
Но на самом деле язык не заботится о том, сколько элементов вы разместили, потому что в любом случае у вас просто есть указатель на «один или несколько» последовательных элементов.
tl; dr это так, как был разработан синтаксис.
Что касается вашего второго вопроса, &p
и *p
дают разные результаты, потому что они означают разные вещи, и я оставлю распознавать эту разницу как упражнение.читателю.