Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

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言語プログラミングにおいて必ず押さえておきたい概念です。

  1. クラウドストレージとは?仕組み・バックアップとの違い・選び方を徹底解説

    クラウドストレージとは、ファイルをインターネット上(クラウド)に保存する仕組みのことです。パソコンの内蔵HDDや外付けハードディスク、USBメモリにデータを保管する代わりに、オンライン上にファイルを置いておくことができます。クラウドストレージを利用する理由はさまざまです。ローカルディスクの空き容量が不足している場合、クラウドを追加の保存先として活用できます。音楽コレクションをどこからでもストリーミング再生したい、自宅から仕事のファイルにアクセスしたい、旅行の動画を手軽に共有したい——そんなニーズにも応えられます。さらに、重要なファイルをパスワードと暗号化でしっかり保護したいという場合にも有効で

  2. Pythonの静的メソッド(@staticmethod)とは?仕組みと使い方を解説

    Pythonのクラスには、インスタンスメソッド、クラスメソッド、静的メソッド(スタティックメソッド)という3種類のメソッドを定義できます。それぞれ役割や呼び出し方が異なり、適切に使い分けることでコードの可読性と保守性が向上します。3種類のメソッドの違いインスタンスメソッド: 第1引数に self を受け取り、オブジェクト(インスタンス)の状態にアクセス・変更できます。クラスメソッド: @classmethod デコレータを付け、第1引数に cls を受け取り、クラス自体の状態にアクセスできます。静的メソッド: @staticmethod デコレータを付け、self も cls も受け取りません