Cのポインタ

この辺で話題になっていたので、友人と色々話す。
で、"abc"とかって、要は配列のリテラルよねぇということで、

char c = "abc"[1];

とかという表現が可能なことに気づく(^^;
てか、gcc 4.0.1では通ったけど、正しいかどうかは知らん。

そういえば、元ネタ記事で、&"0123456789abcdefghi"なんて表記があるのに気づく。ん?こんな表現はあまり使わんなぁ。
…そういえば、

char a[10];

とかあった時に、aと&aが同じ値なんだけど、なんで?という質問を受けたことがあります。
奇妙なんだけど、aはcharへのポインタ型で、&aはサイズ10の配列へのポインタ型ですね。つまり+1した時指す先が違うという。
それでも値としてaと&aが同じものになるというのは、ちょっと奇妙ではあります。

で、話を戻して文字列ですが、多分"abc"って、この配列aと同じような扱いなのかなぁと。
char *p = "abc"と書ける以上、"abc"はcharへのポインタ型。
じゃあ、&"abc"は?と思って、

char (*a)[4] = &"abc";

とやってみると、コンパイラはWarningを出さないので、これで型は合ってるのかな?つまり、&"abc"も配列へのポインタ型と。

調子に乗って、

char c = {'a', 'b', 'c'}[1];

とかやると、コンパイラに怒られる(^^; (char[]){'a', 'b', 'c'}[1]ならOKなんだけど。