今Cを独学で勉強しています。

#include <stdio.h>
int main(void) {
  int *p, q;
  q=199;
  p=&q;
  printf("%d\n", *p);
  return 0;
}
上記のプログラムで、
ポインタの説明をしているところを勉強中なのですが、
なぜ、int pと定義せずに、int *pと定義するのかが分かりません。
*が演算子なら、int pで宣言し、プログラム中で*pという
演算をすれば良いのでは?と思うのですが。

また、なぜ、int *p で定義すれば、プログラム中で、
pが変数宣言も無しで使用可能なのでしょうか?