2012-03-06 24 views
5

ここにコード例があります。静的構造と通常構造の違いは何ですか?

struct node { 
     int data; 
     struct node *link; 
    }; 
    static struct node *first = NULL; 

静的な単語の使用について私の下の質問に誰かが懐疑的になることができたらうれしいです。

  1. 上記のコードでstaticキーワードは何をしていますか?

  2. 通常構造と静的構造の違いは何ですか?

+2

コードには静的構造体はありません。これは 'struct node'の' static'インスタンスです。 – iammilind

+0

@ iammilind:それはそうではなく、 'struct node *'のインスタンスです。 –

答えて

7

nodeへの静的ポインタを作成し、それをNULLに初期化します。

変数の定義は、複数の意味を持つことができます方法の外に定義されている場合

static struct node *first = NULL; 

を、それがfirst内部結合を与えます。これは、定義モジュール内でのみ使用できます。

しかし、あなたはまた、メソッドの内部でその行を見つけることができます:

void foo() 
{ 
    static struct node *first = NULL; 
} 

変数が静的ストレージに存在する方法スコープの変数です。それはNULLに一度初期化され、以後の変更はすべて関数の呼び出しの間に保持されます。

+0

それは質問でした: "静的ポインタ"はどういう意味ですか? –

+0

@KonradRudolphええ、私は質問を誤解しました。今編集されました。 –

+1

後者の場合は、「グローバルスコープではなく、関数スコープと静的記憶期間」を持つ変数と呼ばれます。 –

5

これは、この変数がこのモジュールの外で使用できないことを意味します。

など。 - あなたは重要な注意

extern struct node *first; 

を使用して別のファイルからこのポインタを参照することはできません構造体は静的ではありません、だけでfirstこのような構造体へのポインタであるが静的であるということです。

+0

これは、メソッド内の静的変数でもあります。 –

+0

@LuchianGrigore - 本当に、それを考慮に入れなかった。 – MByD

2

構造自体の定義には影響しません。これは、ここではfirstという名前の構造のインスタンスが内部リンケージを持つことを意味します。

+0

内部リンケージを意味していませんか? –

+0

なぜ、そうです。 :) –

0

グローバル変数のstaticキーワードは、変数が定義されているモジュールに対してローカルになります。私。別のモジュールからアクセスすることはできません。

静的変数が関数内に定義されている場合、この関数の呼び出しの間に変数を有効にして更新します。

0

変数を変更するとき、staticキーワードは静的な持続時間(プログラムの開始時に割り当てられ、プログラムが終了すると割り当て解除される)を指定し、別の値が指定されていない限り0に初期化します。ファイルスコープで変数または関数を変更するとき、staticキーワードは変数または関数に内部リンケージがあることを指定します(名前は宣言されているファイルの外部からは表示されません)。

関数内でstatic宣言された変数は、その関数の呼び出しの間に状態を保持します。

クラス宣言でデータメンバを変更するとき、staticキーワードは、メンバの1つのコピーがクラスのすべてのインスタンスで共有されるように指定します。クラス宣言でメンバ関数を変更するとき、staticキーワードは関数が静的メンバのみにアクセスするように指定します。

クラスの静的データメンバーは、ファイルスコープで初期化する必要があります。

再帰的コードでは、静的オブジェクトまたは変数は、コードブロックの異なるインスタンスで同じ状態を持つことが保証されています。

共用体のメンバーを静的として宣言することはできません。グローバルに宣言された匿名の共用体は、静的に明示的に宣言されなければなりません。

すべてのブロックの外で定義されたオブジェクトと変数は、デフォルトで静的有効期間と外部リンケージを持ちます。静的として明示的に宣言されているグローバルオブジェクトまたは変数には、内部リンケージがあります。

+1

**静的な意味ではありません。**実際には、静的な記憶域に割り当てられ、ヒープやスタックには割り当てられません。 –