この記事では、C言語におけるstatic変数
の使い方と具体的な使用例、さらにstatic変数
とグローバル変数の比較について解説します。
初心者の方でもわかりやすく、サンプルコードを交えて解説していきます。
static変数の使い方
C言語において、static修飾子を付けることで変数をstatic変数
として宣言することができます。
static変数
は、通常のローカル変数とは異なる特徴を持ちます。
以下では、static変数
の宣言方法、初期化方法、スコープとライフタイム、利点と注意点について解説します。
static変数の宣言と初期化
static変数
は、通常のローカル変数と同じように宣言しますが、変数名の前にstatic修飾子を付けます。
例えば、以下のように宣言することができます。
static int count;
static変数
は、宣言時に初期化することも可能です。
初期化しない場合、static変数
は自動的に0で初期化されます。
static int count = 0;
static変数のスコープとライフタイム
static変数
のスコープは、宣言されたブロック内に限定されます。
つまり、そのブロック内でのみアクセス可能です。
また、static変数
はプログラムが起動してから終了するまでの間、メモリ上に保持され続けます。
これにより、関数が呼び出されるたびに初期化されることがなくなります。
static変数の利点と注意点
static変数
の利点は以下の通りです。
- ローカル変数の値を保持するため、関数呼び出しのたびに初期化する必要がない
- 関数内でのデータ共有に利用できる
一方、注意点もあります。
static変数
はグローバル変数と同じく、プログラム全体で共有されるため、他の関数からのアクセスに注意が必要static変数
の使用は適切に制限し、必要最小限に留めるべき
以上が、static変数
の使い方に関する解説です。
次に、具体的な使用例について見ていきましょう。
static変数の具体的な使用例
カウンタ変数としての利用
カウンタ変数は、特定のイベントや処理の回数を数えるために使用されます。
static変数
をカウンタ変数として使用することで、関数が呼び出されるたびに値が保持される特徴があります。
以下は、static変数
をカウンタ変数として使用する例です。
#include <stdio.h>
void count() {
static int counter = 0; // static変数の宣言と初期化
counter++; // カウンタ変数のインクリメント
printf("カウンタの値: %d\n", counter);
}
int main() {
count(); // カウンタの値: 1
count(); // カウンタの値: 2
count(); // カウンタの値: 3
return 0;
}
上記の例では、count関数
内でstatic変数counter
を宣言し、関数が呼び出されるたびに値がインクリメントされます。
このように、static変数
をカウンタ変数として使用することで、関数の呼び出し回数を数えることができます。
ローカル変数の値を保持するための利用
通常、関数内で宣言されたローカル変数は、関数が終了するとその値は破棄されます。
しかし、static変数
を使用することで、関数が終了しても値を保持することができます。
以下は、static変数
を使用してローカル変数の値を保持する例です。
#include <stdio.h>
void printNumber() {
static int number = 10; // static変数の宣言と初期化
printf("numberの値: %d\n", number);
number += 5; // numberの値を更新
}
int main() {
printNumber(); // numberの値: 10
printNumber(); // numberの値: 15
printNumber(); // numberの値: 20
return 0;
}
上記の例では、printNumber関数
内でstatic変数number
を宣言し、関数が呼び出されるたびに値を更新しています。
このように、static変数
を使用することで、関数が終了しても値を保持することができます。
関数内でのデータ共有における利用
複数の関数で同じデータを共有する場合、グローバル変数を使用することが一般的です。
しかし、static変数
を使用することで、関数内でのデータ共有を行うこともできます。
以下は、static変数
を使用して関数内でのデータ共有を行う例です。
#include <stdio.h>
void increment() {
static int sharedData = 0; // static変数の宣言と初期化
sharedData++; // 共有データのインクリメント
}
void printData() {
static int sharedData = 100; // static変数の宣言と初期化
printf("共有データの値: %d\n", sharedData);
}
int main() {
increment();
increment();
printData(); // 共有データの値: 100
return 0;
}
上記の例では、increment関数
とprintData関数
内でそれぞれstatic変数sharedData
を宣言しています。
increment関数
では共有データをインクリメントし、printData関数
では共有データの値を表示します。
このように、static変数
を使用することで、関数間でデータを共有することができます。
関数内でのデータ共有が必要な場合は、グローバル変数を使用する方が適しています。