staticの役割
2378 ワード
http://developer.51cto.com/art/200812/103804.htm
1.まずはその第一条を紹介することも大切なことです.隠します.
複数のファイルを同時にコンパイルする場合、staticプレフィックスを付加していないすべての大域変数と関数は大域的に視認性があります.この話を理解するために、例を挙げて説明します.二つのソースファイルを同時にコンパイルしたいです.一つはa.cで、もう一つはmain.
以下はa.cの内容です.
Aハロー
なぜa.cで定義されているグローバル変数aと関数msgがmail.cで使用できますか?前に述べたように、staticプレフィックスを付加していないすべてのグローバル変数と関数は、グローバル視認性を持っています.他のソースファイルもアクセスできます.この例では、aはグローバル変数であり、msgは関数であり、staticプレフィックスは加えられていないので、別のソースファイルmail.cについては見られます.
staticを追加すると、他のソースファイルに隠します.例えばaとmsgの定義の前にstaticを加えると、main.cはそれらが見えなくなります.この特性を利用して、異なるファイルに同名の関数と同名の変数を定義できます.名前の衝突を心配する必要はありません.Staticは関数と変数のプレフィクスとして使用でき、関数としてはstaticの役割は非表示に限定され、変数に対してはstaticは次の2つの役割がある.
2.staticの第二の役割は変数の内容の持続性を維持することである.
静的データエリアに格納されている変数は、プログラムが起動した直後に初期化が完了します.唯一の初期化です.二つの変数が静的記憶領域に格納されています.グローバル変数とstatic変数は、大域変数と比べて、staticは変数の可視範囲を制御できます.つまり、staticは隠します.このような使い方はあまり見られませんが、例を挙げます.
global local static 1 102 93 84 75 66 57 48 39 210 1
3.staticの第3の役割はデフォルトで0に初期化されます.実はグローバル変数もこの属性を備えています.グローバル変数も静的データ領域に格納されているからです.
静的データエリアでは、メモリ内のすべてのバイトのデフォルト値は0 x 00であり、この特徴は、プログラマの仕事量を減らすことができる場合があります.たとえば、まばらな行列を初期化して、すべての要素を1つずつ0にして、それから0ではないいくつかの要素を値付けします.静的に定義されているなら、0を最初に置く作業は省略されます.また、たとえば文字列として1つの文字列を使いますが、毎回文字配列の末尾に「/0」を付けるのは面倒くさいと思います.文字列を静的に定義すれば、その手間を省きます.そこはもともと「0」です.小さい実験をして検証してもいいです.
最後にstaticの三つの役割について一言でまとめます.まずstaticの最も主要な機能は非表示であり、次にstatic変数は静的記憶領域に保存されるので、耐久性とデフォルト値0を備えている.
1.まずはその第一条を紹介することも大切なことです.隠します.
複数のファイルを同時にコンパイルする場合、staticプレフィックスを付加していないすべての大域変数と関数は大域的に視認性があります.この話を理解するために、例を挙げて説明します.二つのソースファイルを同時にコンパイルしたいです.一つはa.cで、もう一つはmain.
以下はa.cの内容です.
char a = 'A'; // global variable
void msg()
{
printf("Hello/n");
}
以下はメールの内容です. int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}
プログラムの実行結果は:Aハロー
なぜa.cで定義されているグローバル変数aと関数msgがmail.cで使用できますか?前に述べたように、staticプレフィックスを付加していないすべてのグローバル変数と関数は、グローバル視認性を持っています.他のソースファイルもアクセスできます.この例では、aはグローバル変数であり、msgは関数であり、staticプレフィックスは加えられていないので、別のソースファイルmail.cについては見られます.
staticを追加すると、他のソースファイルに隠します.例えばaとmsgの定義の前にstaticを加えると、main.cはそれらが見えなくなります.この特性を利用して、異なるファイルに同名の関数と同名の変数を定義できます.名前の衝突を心配する必要はありません.Staticは関数と変数のプレフィクスとして使用でき、関数としてはstaticの役割は非表示に限定され、変数に対してはstaticは次の2つの役割がある.
2.staticの第二の役割は変数の内容の持続性を維持することである.
静的データエリアに格納されている変数は、プログラムが起動した直後に初期化が完了します.唯一の初期化です.二つの変数が静的記憶領域に格納されています.グローバル変数とstatic変数は、大域変数と比べて、staticは変数の可視範囲を制御できます.つまり、staticは隠します.このような使い方はあまり見られませんが、例を挙げます.
#include <stdio.h>
int fun(void){
static int count = 10; //
return count--;
}
int count = 1;
int main(void)
{
printf("global/t/tlocal static/n");
for(; count <= 10; ++count)
printf("%d/t/t%d/n", count, fun());
return 0;
}
プログラムの実行結果は:global local static 1 102 93 84 75 66 57 48 39 210 1
3.staticの第3の役割はデフォルトで0に初期化されます.実はグローバル変数もこの属性を備えています.グローバル変数も静的データ領域に格納されているからです.
静的データエリアでは、メモリ内のすべてのバイトのデフォルト値は0 x 00であり、この特徴は、プログラマの仕事量を減らすことができる場合があります.たとえば、まばらな行列を初期化して、すべての要素を1つずつ0にして、それから0ではないいくつかの要素を値付けします.静的に定義されているなら、0を最初に置く作業は省略されます.また、たとえば文字列として1つの文字列を使いますが、毎回文字配列の末尾に「/0」を付けるのは面倒くさいと思います.文字列を静的に定義すれば、その手間を省きます.そこはもともと「0」です.小さい実験をして検証してもいいです.
#include <stdio.h>
int a;
int main(void)
{
int i;
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
return 0;
}
プログラムの運転結果は以下のinteger:0です.string:(begin)(end)最後にstaticの三つの役割について一言でまとめます.まずstaticの最も主要な機能は非表示であり、次にstatic変数は静的記憶領域に保存されるので、耐久性とデフォルト値0を備えている.