>>29
よくある勘違いだな。

char *pはポインタ型の(だいたい4byte)変数に、アドレスの値が入ってる。
char a[]はcharの固まりという型?の(文字列数n byte+終端文字1 byte)変数に、モロに文字列が並んでいる。

int main() {
char *p = "abcdefg";
char a[] = "hijklmn";
printf("%d %d\n", sizeof p, sizeof a); // 変数のサイズをみてみよう
printf("%p %p\n", p, &p); // 値と、変数pのアドレス
printf("%p %p\n", a, &a); // ポインタに成り下がった変数の先頭アドレスと、変数aのアドレス
}

ただ、配列はちょくちょくポインタに成り下がるので注意。
関数に配列名を渡した時、関数内では単にポインタとして扱う。

詳しくは「エキスパートCプログラミング」って本を参照されたい。