くいなちゃんの初心者向け C言語の配列 講座ツイートまとめ
C言語の配列、みんな知っているようで、意外とテキトーに済ませている人が多かったりします。 今日は、その あまり知られていない部分のお話をしたいと思いますー♡
2013-07-14 18:00:19まず、配列 int a[5]; に対し、a[3] = 0; とか書けると思います。 この a[3] は、配列でしょうか? どう見ても配列っぽいですよねー。 じつはー、これは配列ではありません!!!
2013-07-14 18:03:12前にも言いましたが、a[3] はコンパイル時に機械的に *(a + 3) になりますので、配列ではなく 「ポインタ演算」 になります。 では、この *(a + 3) をもう少し見ていくことにしましょうー☆
2013-07-14 18:04:38そもそも *(a + 3) とはどういう演算なのでしょうか。 ここに書かれている a とは、何を表すのか。 + 3 とはどういう演算なのか。 * は、何なのか。 これらを把握しないといけませんね。 順に説明しますっ。
2013-07-14 18:06:18まず a について。 int a[5]; と宣言して、式中に a と書いた場合、それは 「a[5] の領域が確保されているメモリ上の区間の、先頭アドレス」 を表します。 例えばa[5]において、アドレス100番地から int 5つ分のスペースが取られた場合、a は 100ですん☆
2013-07-14 18:09:19では、a + 3 は何を表すのでしょうか。 それは、a (a[5]の先頭アドレス) から、int 3つ分 進んだところのアドレス という意味になるです! ちなみに、もし a が char a[5]; ならば、a + 3 は int 3つ分先 ではなく、char 3つ分先になります
2013-07-14 18:11:39たとえば、ここで int を 4byte と仮定しましょう。 すると、先ほどの int a[5]; の a が 100番地 だったことから、a + 3 は、100 + 3 * 4 = 112番地 となるですん☆ ここまで大丈夫ですかにゃ。
2013-07-14 18:13:27最後に、*(a + 3) ですん。 * は、掛け算ではなく、「そのアドレス先にある値」 とか 「そのポインタが指す先の値」 を意味します。 つまり、a + 3 が112番地だったので、*(a + 3) は、メモリの112番地に格納されている値という意味ですね。 この値のサイズは、
2013-07-14 18:15:39この値のサイズは、a が int[5] であることにより、int のサイズ分として扱われます。 つまり、112番地から4byte(intのサイズ)分の値 という結果になるのですん☆ この結果は、わたしたちが a[3] を見て想像する値と同じものを指していますね♡
2013-07-14 18:18:43文字列と配列とポインタの関係ですん。 char c[6] = "Hello"; と書いたとき、c は先ほどの通り、メモリに確保されたchar 6つ分の領域の先頭アドレスを意味します。 で、その領域にそれぞれ H e l l o \0 が入っているわけですね。
2013-07-14 18:22:27では、char* c = "Hello"; と書いた場合はどうなるでしょう。 もちろん、これもコンパイル通ります♡ cだけ見ると、char c[6] のときと同様、単なるアドレスを指すポインタと解釈できますよね。 でもこの場合、メモリ上に領域が確保されていないように見えます!
2013-07-14 18:24:12くいなちゃんの話気になるのに初心者があーだこーだいう奴何なの???? さっきの内容は参考書とかネットでも十分調べられる話じゃん。とりま、話聞いてから質問すればいいのでは?
2013-07-14 18:31:09いや、専門分野がどうとかではなく、一般常識の話なので… ят @m_akihiro: @b2 ラムダ計算理論から計算機科学に入った人に喧嘩売ってることになりませんかそれ
2013-07-14 18:31:22