C言語のstatic記憶クラスとは?仕組みと使い方をわかりやすく解説
C言語の4つの記憶クラス
C言語には、変数のスコープや寿命(記憶域期間)を制御するための記憶クラス(ストレージクラス)が用意されており、主に以下の4種類があります。
- auto
- extern
- static
- register
この記事では、その中でも特に重要な「static記憶クラス」について、サンプルコードを交えながら詳しく解説します。
static変数の特徴
static変数を宣言するには、キーワード static を使用します。主な特徴は次のとおりです。
スコープと寿命
- static変数はプログラムの実行終了まで値を保持し続けます。関数呼び出しの間でも値は失われません。
- 初期化はプログラム実行時に一度だけ行われ、関数が再度呼び出されても再初期化されません。
また、明示的に初期化しない場合でも、static変数のデフォルト値はゼロに設定されます。
例1:static変数の基本的な動作
以下は、static記憶クラスを使用したC言語のサンプルプログラムです。
#include<stdio.h>
main ( ){
inc ( );
inc ( );
inc ( );
}
inc ( ){
static int i =1;
printf ("%d", i);
i++;
}実行結果
1 2 3
i がstatic変数として宣言されているため、関数 inc() が呼び出されるたびに前回の値が保持されます。その結果、1 → 2 → 3 と値が増加して表示されます。
例2:autoとの比較
同じ処理をauto変数で書き換えると、挙動が大きく変わります。
#include<stdio.h>
main ( ){
inc ( );
inc ( );
inc ( );
}
inc ( ){
auto int i=1;
printf ("%d", i);
i++;
}実行結果
1 1 1
auto変数は関数が呼び出されるたびに新しく作られ、毎回 1 で初期化されるため、何度呼んでも常に「1」が表示されます。この比較により、static変数が「値を記憶し続ける」ことがよく分かります。
例3:プロトタイプ宣言を使った例
より現代的なスタイルで、関数プロトタイプ宣言を使用した例を紹介します。
#include <stdio.h>
//function declaration
void function();
int main(){
function();
function();
return 0;
}
//function definition
void function(){
static int value= 1; //static variable declaration
printf("\nvalue = %d ", value);
value++;
}実行結果
value = 1 value =2
この例でも、static変数 value の値が関数呼び出し間で保持されているため、1回目は「1」、2回目は「2」と表示されます。
まとめ
static記憶クラスを利用すると、変数の値をプログラム全体の実行期間にわたって保持できます。関数内カウンタや状態管理など、呼び出し間で値を維持したい場面で非常に役立つため、C言語プログラミングにおいて必ず押さえておきたい概念です。
-
クラウドストレージとは?仕組み・バックアップとの違い・選び方を徹底解説
クラウドストレージとは、ファイルをインターネット上(クラウド)に保存する仕組みのことです。パソコンの内蔵HDDや外付けハードディスク、USBメモリにデータを保管する代わりに、オンライン上にファイルを置いておくことができます。クラウドストレージを利用する理由はさまざまです。ローカルディスクの空き容量が不足している場合、クラウドを追加の保存先として活用できます。音楽コレクションをどこからでもストリーミング再生したい、自宅から仕事のファイルにアクセスしたい、旅行の動画を手軽に共有したい——そんなニーズにも応えられます。さらに、重要なファイルをパスワードと暗号化でしっかり保護したいという場合にも有効で
-
Pythonの静的メソッド(@staticmethod)とは?仕組みと使い方を解説
Pythonのクラスには、インスタンスメソッド、クラスメソッド、静的メソッド(スタティックメソッド)という3種類のメソッドを定義できます。それぞれ役割や呼び出し方が異なり、適切に使い分けることでコードの可読性と保守性が向上します。3種類のメソッドの違いインスタンスメソッド: 第1引数に self を受け取り、オブジェクト(インスタンス)の状態にアクセス・変更できます。クラスメソッド: @classmethod デコレータを付け、第1引数に cls を受け取り、クラス自体の状態にアクセスできます。静的メソッド: @staticmethod デコレータを付け、self も cls も受け取りません