シェアする

  • このエントリーをはてなブックマークに追加

C言語 ポインタが理解できない理由 – メモリの中身を知ろう

シェアする

  • このエントリーをはてなブックマークに追加
  • 1

C言語 ポインタが理解できない理由 – メモリの中身を知ろうこんにちは、じゅんです。

c_pointer_mindmap

ポインタって何でしょう?

今日はそんな基礎の基礎からお話しを始めたいと思います。

ポインタの基礎の基礎 – ポインタはアドレスを指し示しているのだ

今日はポインタって何?という話しから始めたいと思います。

    1. プログラム
    2. メモリの使われ方
    3. 型とポインタ
    4. 配列とポインタ
    5. 文字列とポインタ
    6. mallocとポインタ
    7. 関数とポインタ
    8. 構造体とポインタ

ポインタを勉強する時によく見たり聞いたりするのは

  • 変数は値を入れるもの
  • ポインタはアドレスを入れるもの

という定義です。

正しいことを言っているのですが、C言語初心者にはなぜアドレスを入れる必要があるのか、何に使えるものなのかがこれだけだとよく分かりませんね。

それには今回取り上げた『C言語 ポインタが理解できない理由』の1章、2章を読んで、『プログラム』や『メモリ』というものがどういうものなのかという基本を理解することで理解が早まると思います。

基本的に我々が作った『プログラム』は『メモリ』の中の『テキストセグメント』或いは『コードセグメント』と呼ばれる部分に入れられます。

このように『メモリ』の中には『セグメント』と呼ばれる目的別の領域が作られます。

『テキストセグメント』以外には『グローバル変数』やmallocにより動的に割り当てられた変数が入る『データセグメント』、『ローカル変数』や『引数』が収められる『スタックセグメント』が存在します。

このように『メモリ』の中身を区画整理して、目的別に使い分けている訳ですね。

これらの領域はアドレスの何番地から何番地までがAの領域、次の何番地から何番地までがBの領域という風に割り当てられる訳ですね。

更に『データセグメント』の中は”初期値を持つ”『グローバル変数』と”初期値を持たない”『グローバル変数』、それにmallocにより動的に割り当てられた領域に分けられます。

また『スタックセグメント』は『ローカル変数』を扱ってる訳です。

この『ローカル変数』、1つの関数の中だけで有効な変数で、どの関数からでも有効な『グローバル変数』とは性質を異にするものです。

なので、『スタックセグメント』の中身は関数ごとに積まれていく(スタックされる)訳です。

スタックセグメント(ローカル変数や引数が収められるメモリ領域)
データセグメント(ヒープ:mallocにより動的に割り当てられる領域)
データセグメント(BSS:初期値を持たないグローバル変数)
データセグメント(データ:初期値を持つグローバル変数)
テキストセグメント(ブログラムコードが入った読み出し専用部分)

プログラムはこうやって動いている訳ですね。

明日以後はこの構造を理解した上で『ポインタ』を説明したいと思います。