おさえておきたいプログラミングの基本
C言語の変数は、グローバル変数、ローカル変数などの種類がありますが、それらは、それぞれデータが記憶される領域が異なります。その記憶領域のことを、記憶クラスと言います。ここでは、変数の種類ごとの記憶クラスについて解説します。
関数内部で宣言され、宣言された関数の中でのみ使用可能な変数のことを、自動変数と言います。自動変数は、頭にauto指定子を記述します。
list_storage6-1:main.c#include <stdio.h>
int main(int argc, char** argv) {
auto int n = 100; // 自動変数の宣言と初期化
printf("n=%d\n", n);
return 0;
}
実行結果
auto指定子は、通常省略されているため、使用されることはまずないでしょう。ただ、自動変数は、メモリの中でもスタック領域と呼ばれる部分に記憶されます。この領域に記憶された変数は、関数の処理の終了と共にメモリから消去されます。
list_storage6-2:main.c#include <stdio.h>
int g = 10; // 外部変数の宣言
void showExterns();
int main(int argc, char** argv) {
// 値の表示
printf("g=%d\n", g);
showExterns();
return 0;
}
void showExterns(){
printf("g=%d\n", g);
}
実行結果
実行結果からわかるとおり、外部変数は、どのmain()およびshowExterns()関数どちらからもアクセスすることができます。外部変数は、静的領域に記憶されているため、プログラム実行とともに生成され、プログラム終了と共に消えます。
プログラム実行中に常に同じ場所に配置され値を保持したいときには、静的変数(せいてきへんすう)を用います。関数内部で宣言され、先頭にstatic指定子をつけます。
宣言された関数の中でのみ使用可能であるという意味では、自動変数と一緒ですが、記憶される領域が静的領域であるというのが、この変数の特徴です。プログラム開始処理の前に一度だけ初期化を行うことができます。
では、実際に、実例を見てみましょう。
list_storage6-3:main.c#include <stdio.h>
int g = 10; // 外部変数の宣言
void showStatic();
int main(int argc, char** argv) {
showStatic();
showStatic();
return 0;
}
void showStatic(){
static int s = 100; // 静的変数の宣言と初期化
printf("s=%d\n", s);
s++; // 静的変数のインクリメント
}
実行結果
静的変数sは、変数showStatic()の中で定義されています。12行目で宣言・初期化されています。値が初期化処理が実行されるのは、あくまでも6行目から、最初にこの関数が呼ばれたときだけです。二回目以降は、この処理が呼ばれることはありません。
その証拠に、14行目でsの値がインクリメントされるため、再びこの関数を呼び出すと、sの値は、101になっています。これは、静的変数が一度定義されたらプログラム実行まで消えないうえに、初期化が一度しか行われないからです。
以上から、自動変数がスタック領域、外部変数および静的変数は静的領域に記憶されていることがわかります。変数を記憶する領域としては、このほかにヒープ領域と呼ばれるものがあります。この領域に関しては、メモリの生成と消去(応用編第3日目で詳しく説明します。)
練習問題 : 問題6.
一週間でわかるC言語・C++言語がオンライン講座になりました!動画と音声によってさらにわかりやすくなりました!! 1講座で2つの言語を学ぶことができる上に、練習問題の回答もダウンロードできます。
Read →本講座が「1週間でC言語の基礎が学べる本」として書籍化されました!サイトの内容プラスアルファでより学習しやすくなっています!Impressより発売中です!!
Read →