結局 char a[] = "abc" は char a[] = { 'A', 'B', 'C', '\0' } に同じ
これは丸暗記するしか無し

で

char a[] = "abc";  /* Statement1 */
char *p = "abc";   /* Statement2 */

となるとイメージ的にはこんな感じ
罫線多少ズレるけど許して
                    a[0]  a[1]  a[2]  a[3]
                   .┏━━┯━━┯━━┯━━┓
                  a┃char.│char.│char│char.┃
                   .┗━━┷━━┷━━┷━━┛
        Statement2 が    ↑  ↑  ↑  ↑Statement1 が実行
        実行されるたびに  .│  │  │  │されるたびにコピー
. ┏━━━┓アドレスをセット ┌──┬──┬──┬──┐
p┃char * ┃←──────.│ 'A' │ 'B' │ 'C' │ '\0'.│←どっかの変更不能
. ┗━━━┛           └──┴──┴──┴──┘ なメモリ領域
                    p[0]  p[1]  p[2]  p[3]

なお、a と p はそれぞれ配列型 (char[4]) とポインタ型 (char*) で全然別の型
でも関数とかに渡すと配列型はその最初の要素へのポインタ型 (この場合は
char*) に成り下がる

>>133
> sizeof(p)とsizeof(a)
この場合はどっちも 4 だからよくわからない