静的変数、ローカル変数、グローバル変数の詳細
最近C++を拾い直して、このいくつかの概念を学んで、スタックの呼び出し、分配などに関連して、ここで再び整理して、各位とお互いに学習を討論することを望みます.
静的データ・メンバーは、プログラム内にコピーが1つしかなく、このタイプのすべてのオブジェクトが共有してアクセスします.非静的データ・メンバーではない場合、各クラス・オブジェクトには独自のレプリカがあります.
クラスの静的メンバーは初期化する必要があります.静的メンバーがクラスである場合、そのコンストラクション関数が呼び出されます.
静的メンバー関数は、クラスの特定のオブジェクトにサービスするのではなく、クラスのすべてのサービスです.静的メンバー関数は、任意のオブジェクトに関連付けられていないため、thisポインタはありません.
プログラム出力は
0
0
0
プログラム出力は
1
1
2
注記:
static変数は一度だけ初期化され、「記憶」機能を持ち、ソースプログラムと「生死、共存亡」する.
Auto変数はスタック領域に格納され、呼び出しが終了するとすぐに破棄されます.
ヘッダファイルに静的変数を定義すると、スペースが浪費されたり、プログラムエラーが発生したりします.各C言語ファイルでこのヘッダファイルが使用されている場合、各ヘッダファイルに静的変数が個別にリストされるためです.
グローバル変数定義を含まないソースファイルは、externキーでグローバル変数を再宣言する必要があります.
グローバル変数、静的ローカル変数、および静的グローバル変数は、静的ストレージ領域に空間を割り当て、ローカル変数はスタックに空間を割り当てます.
グローバル変数はグローバル役割ドメインを有し、静的変数は安定した役割ドメインを有する.
静的局所変数は局所作用ドメインを有し,一度だけ初期化される.静的グローバル変数にはファイルの役割ドメインがあり、1つのプログラムに複数のファイルが含まれている場合は、静的グローバル変数を宣言するファイルのみが有効になります.
注記:
iは静的局所変数であり,一度だけ初期化される.
jは静的グローバル変数であり,関数呼び出しのたびに初期化される.
グローバル変数は、初期化されていないデフォルトが0であることのみを定義します.
ローカル変数は未初期化のみを定義し、intタイプの場合、デフォルトは-858993460、すなわち0 xccccccです.
プログラム出力結果は次のとおりです.
9
10
注記:
printf関数は、常にリスト変数の右端からスタックを計算し、左から右に対応するポップアップスタックを計算します.
ローカル変数はグローバル変数と名前を変更できますが、ローカル変数はグローバル変数をブロックします.グローバル変数を使用するには、アクション::.
プログラム出力結果:
-858993460
注記:
main関数で定義されたiはグローバル変数iをブロックし、定義されたi=それ自体になるため、ランダム値が出力されます.
静的データ・メンバーは、プログラム内にコピーが1つしかなく、このタイプのすべてのオブジェクトが共有してアクセスします.非静的データ・メンバーではない場合、各クラス・オブジェクトには独自のレプリカがあります.
クラスの静的メンバーは初期化する必要があります.静的メンバーがクラスである場合、そのコンストラクション関数が呼び出されます.
静的メンバー関数は、クラスの特定のオブジェクトにサービスするのではなく、クラスのすべてのサービスです.静的メンバー関数は、任意のオブジェクトに関連付けられていないため、thisポインタはありません.
#include
void fun(int i)
{
static int value=i++;
printf("%d
",value);
}
int main()
{
fun(0);
fun(1);
fun(2);
return 0;
}
プログラム出力は
0
0
0
#include
void fun(int i)
{
static int value=i++;
value=i++;
printf("%d
",value);
}
int main()
{
fun(0);
fun(1);
fun(2);
return 0;
}
プログラム出力は
1
1
2
注記:
static変数は一度だけ初期化され、「記憶」機能を持ち、ソースプログラムと「生死、共存亡」する.
Auto変数はスタック領域に格納され、呼び出しが終了するとすぐに破棄されます.
ヘッダファイルに静的変数を定義すると、スペースが浪費されたり、プログラムエラーが発生したりします.各C言語ファイルでこのヘッダファイルが使用されている場合、各ヘッダファイルに静的変数が個別にリストされるためです.
グローバル変数定義を含まないソースファイルは、externキーでグローバル変数を再宣言する必要があります.
グローバル変数、静的ローカル変数、および静的グローバル変数は、静的ストレージ領域に空間を割り当て、ローカル変数はスタックに空間を割り当てます.
グローバル変数はグローバル役割ドメインを有し、静的変数は安定した役割ドメインを有する.
静的局所変数は局所作用ドメインを有し,一度だけ初期化される.静的グローバル変数にはファイルの役割ドメインがあり、1つのプログラムに複数のファイルが含まれている場合は、静的グローバル変数を宣言するファイルのみが有効になります.
#include
static int j;
int k=0;
int m;
void fun1()
{
static int i=0;
i++;
m=i;
}
void fun2()
{
j=0;// ,j 10
j++;
}
int main()
{
for(k=0;k<10;k++)
{
fun1();
fun2();
}
printf("%d
",m);
printf("%d
",j);
return 0;
}
注記:
iは静的局所変数であり,一度だけ初期化される.
jは静的グローバル変数であり,関数呼び出しのたびに初期化される.
グローバル変数は、初期化されていないデフォルトが0であることのみを定義します.
ローカル変数は未初期化のみを定義し、intタイプの場合、デフォルトは-858993460、すなわち0 xccccccです.
#include
int my(const int a)
{
static int count=a;
return count + a;
}
int main()
{
printf("%d
%d
",my(4),my(5));
return 0;
}
プログラム出力結果は次のとおりです.
9
10
注記:
printf関数は、常にリスト変数の右端からスタックを計算し、左から右に対応するポップアップスタックを計算します.
ローカル変数はグローバル変数と名前を変更できますが、ローカル変数はグローバル変数をブロックします.グローバル変数を使用するには、アクション::.
#include
int i=1;
int main()
{
int i=i;
printf{"%d
",i);
return 0;
}
プログラム出力結果:
-858993460
注記:
main関数で定義されたiはグローバル変数iをブロックし、定義されたi=それ自体になるため、ランダム値が出力されます.