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なんだけど。