#なぜ学び直したか
専門学校に入り3年目、プログラムについて学んできたけれど知らないことがまだ多かった......
まずはキーワード (static, const) とかについて勉強をし直していたところ
staticとは、静的記憶クラスを使用し、静的に存在する領域にデータを保持することができる。
こう書いてありました。
はい、静的領域について詳しく知りませんでした。
効果は知っているけれど、初歩のここで躓いてしまったので最初のところから学び直そうとしたわけです。
それでは記憶域と変数についての説明をしていきましょう
##記憶領域
記憶領域とは……プログラムやデータを格納する場所のこと(メモリ領域とも言う)
記憶領域にはいくつかの領域が存在します。
「テキスト領域」
「静的領域」
「ヒープ領域」
「スタック領域」
各領域の呼称や、メモリの使われ方は処理系により異なるようですが、大まかな点は同じらしいです。
コード領域は**「コードテキスト領域」****「プログラム領域」と読んだり
静的領域とヒープ領域を合わせて「データ領域」**と呼んだりもします
###各領域の説明
「テキスト領域」
機械語に変換されたプログラムが格納される場所。
C言語、C++、Javaなどは高水準言語と呼ばれており、この機械語を人間に分かりやすくした形になります。
逆に低水準言語と呼ばれるものにはアセンブリ言語と呼ばれるものがあり、こちらは機械語に対して1対1と機械語に近い言語です。
「静的領域」
外部変数(グローバル変数)や静的変数(static変数)などを格納する場所。
この二つの変数の特徴は、プログラム開始処理の前に1度だけ初期化を行う点。
1度しか初期化をしないため、後の処理で値が変わることはありません。
ほかの特徴は、実行中は常に同じ場所に値が配置される点。
アドレスなどが変更されないということですね。
「ヒープ領域」
new演算子やmalloc関数のように、プログラマー側がメモリを確保する時に格納される領域
こちらの領域は格納時には若いアドレスから情報を持つようになっています。
(若いアドレスとは、0x0000のような小さい数値のほうです)
「スタック領域」
自動変数(intやfloat)や、引数・戻り値など一時的に保存する変数などが格納される領域
スタック領域はヒープ領域とは逆な点が多いです。
保存される場合、アドレスは大きい値から格納されていきます(0xFFFFのように)
それでは次は変数について一部を説明していきましょう。
###変数とスコープ
変数には自動変数,外部変数,静的変数があります。
それぞれのスコープの違いについて話していきます。
まずは下の画像を見てください
こちらにはシステム,ファイル,関数の3つのスコープがあります。
自動変数と呼ばれるものは、関数スコープ
外部変数(グローバル変数)はシステムスコープ
静的変数(スタティック変数)はファイルスコープに分けられます。
・それぞれの挙動は、自動変数は{ブロック}に囲まれた範囲でしか値を保持できません。
・グローバル変数は、ファイルの範囲内で使用でき、別のファイルではextrunを使用すると、他ファイルで定義したグローバル変数を使用することができます。
・スタティック変数は、宣言した場所にスコープを限定することができます。
関数で宣言したならば関数内までにしかスコープが設定されません。
私が調べたことはここまでです。
参考資料として私が勉強したものを
C言語 extern宣言とグローバル変数
https://monozukuri-c.com/langc-funclist-extern/
記憶クラスとスコープについての資料
http://www9.plala.or.jp/sgwr-t/c/sec12.html
http://www.ibe.kagoshima-u.ac.jp/edu/gengo0/p11.html
ヒープ領域とスタック領域の違いの解説
https://proglife.net/heap-stack/