>613
ポインタ=アドレスではない。ポインタとはあくまでもオブジェクトを指すものであって
メモリ上のアドレスと決まっているわけではない。*pと書くとpが指しているものを取り出せることが
保証されているというだけの話。実際Cはアドレスとそのオブジェクトのサイズをコンパイラが覚えることで
ポインタという機能を実装している。一応これが前提。

基本的に式の中で配列名だけを書くとその配列の先頭の要素のポインタに読み替えられる。
ただし例外があって&, sizeofのオペランドになるときは配列全体の意味になる。
もういっこ例外があったと思うのだが思い出せない。

よってp = a; と p = &a[0]; は同じ意味。

それと質問に直接関係ないが
char a[4] = "xyz";
は
char a[] = "xyz";
と書くのがふつう。