C言語のトークストレージクラス、リンク.
4437 ワード
C言語学習の大きな難点はメモリ管理、ストレージクラス、リンクであり、メモリ管理操作の前に身につけなければならないことを認識しています.私たちが大学1年生でC言語を勉強していたとき、static、extern、およびシングルチップマシンのプログラミングで出会ったregisterというキーワードに出会ったことがあります.実際には、ストレージクラス、リンクについて理解すると、これらの疑問は解決されます.1.ストレージクラスまず、変数と関数のアクセス性(すなわち、役割ドメイン範囲scope)と生存期間(life time)のストレージクラスについて議論します.変数の格納時期に従って記述したり、その役割ドメインとそのリンクに従って記述したりすることができます.役割ドメインは、コードブロック、すなわち{}と理解でき、このコードブロックに定義された変数は、コードブロックの役割ドメインを有する.例:
この例では、変数tmpはforループというコードブロックでしか機能しないので、彼の役割ドメインはforループ内部のコードブロック内であり、このコードブロック内でのみtmpにアクセスすることができる.またtmpは一時変数であり,コードブロックが出ると破棄される.2.リンクストレージクラスを明らかにした後、リンクとは何かを明らかにします.リンクは3つに分けられ、内部リンク、外部リンク、空のリンクがあります.空のリンク:定義されたコードブロックが1つだけプライベートです.外部リンク:変数は複数のファイルで使用できます.内部リンク:変数は1つのファイルでのみ使用できます.3.ストレージ期間はストレージ期間に対して、実際には多くの接触があり、静的ストレージ期間と自動ストレージ期間に分けられています.静的で、ずっと存在して、プログラムの実行期間はずっと存在します.ここで注意してください.実際には、ストレージ期間ではなくリンクタイプを示すキーワードstaticがよく使用されます.これは、1つの変数に内部リンクがあり、すべての変数に対して、内部でも外部でも静的ストレージ期間があることを示しています.自動ストレージ期間:このタイプの変数は一般的に1つのコードブロック内の変数と呼ばれ、コードブロックに入るとメモリが割り当てられ、コードブロックを終了するとメモリが破棄されます.私たちが使用するローカル変数はすべて自動ストレージ期間に属します.例:
やはりこのプログラムでは,我々が定義したtmpは局所変数である.彼は自動ストレージタイプです.Cでは、自動、レジスタ、コードブロックの役割ドメインを持つ静的、外部リンクを持つ静的、内部リンクを持つ静的の5種類のストレージクラスが一般的です.
これにより、すべてのストレージクラスの問題を明らかにすることができます.次に、この5つのストレージクラスを分析します.4.自動変数は自動的に変わり、キーワードautoを使用しますが、プログラムはデフォルトではコードブロックと関数のヘッダ定義がすべて自動記憶クラスなので、このautoは省略されることが多いです.例:
これは私たちが普段変数iを直接宣言しているのと同じですが、autoの多くは省略されています.5.レジスタ変数ここではレジスタについて言及し、レジスタもデータを格納するハードウェアであり、メモリよりも高速であるため、多くの場合、私たちが書いたプログラムはコンパイラによってレジスタに格納され、プログラムの実行速度が速くなる.したがって、レジスタとメモリは別々の2つのものであり、レジスタ変数はレジスタに格納され、一般的には速度を最適化するために使用されるが、レジスタ変数はメモリに開かれていないため、アドレスを取ることができないことに注意しなければならない.6.外部リンクを持つ静的変数まず、これは静的変数であることを知っておく必要があります.静的変数については、静的とは、格納方式を指しますが、静的格納方式であるのは必ずしも静的変数ではありません.例えば、外部変数、彼は静的格納方式ですが、静的変数ではありません.外部リンクを持つ静的変数で、変数の定義宣言をすべての関数の外に置く.すなわち、外部変数を作成し、参照するときにexternキーワードを使用して再宣言する.
このコードでは、main()関数がvalを参照するときに、前にexternキーワードが付けられていることが明らかになります.これは、main関数の外にvalという変数が定義されているためです.この変数は外部リンクを持つ静的変数であり、externが漏れたら独立した変数になり、main関数に再び空間を開いて操作するからです.上記の例のvalのような外部変数では、初期化しないと自動的に0が割り当てられます.外部変数についても制限があり,名前をつける際には局所環境のルールを守らなければならない.またexternを使用して外部定義を行わないでください.例:
extern知識は変数を参照し、定義できないことを明らかにします.
7.内部リンクを持つ静的変数.この変数は関数の内部で定義され、staticキーワードを使用しているため、1つのファイルでしか操作できません.例:
彼の参照は依然としてストレージクラスの説明子externを使用して変数を再宣言します.例:
#include<stdio.h>
int main()
{
int i;
int j = 5;
for (i = 0; i<10; i++)
{
int tmp = i*j;
}
return 0;
}
この例では、変数tmpはforループというコードブロックでしか機能しないので、彼の役割ドメインはforループ内部のコードブロック内であり、このコードブロック内でのみtmpにアクセスすることができる.またtmpは一時変数であり,コードブロックが出ると破棄される.2.リンクストレージクラスを明らかにした後、リンクとは何かを明らかにします.リンクは3つに分けられ、内部リンク、外部リンク、空のリンクがあります.空のリンク:定義されたコードブロックが1つだけプライベートです.外部リンク:変数は複数のファイルで使用できます.内部リンク:変数は1つのファイルでのみ使用できます.3.ストレージ期間はストレージ期間に対して、実際には多くの接触があり、静的ストレージ期間と自動ストレージ期間に分けられています.静的で、ずっと存在して、プログラムの実行期間はずっと存在します.ここで注意してください.実際には、ストレージ期間ではなくリンクタイプを示すキーワードstaticがよく使用されます.これは、1つの変数に内部リンクがあり、すべての変数に対して、内部でも外部でも静的ストレージ期間があることを示しています.自動ストレージ期間:このタイプの変数は一般的に1つのコードブロック内の変数と呼ばれ、コードブロックに入るとメモリが割り当てられ、コードブロックを終了するとメモリが破棄されます.私たちが使用するローカル変数はすべて自動ストレージ期間に属します.例:
#include<stdio.h>
int main()
{
int i;
int j = 5;
for (i = 0; i<10; i++)
{
int tmp = i*j;
}
return 0;
}
やはりこのプログラムでは,我々が定義したtmpは局所変数である.彼は自動ストレージタイプです.Cでは、自動、レジスタ、コードブロックの役割ドメインを持つ静的、外部リンクを持つ静的、内部リンクを持つ静的の5種類のストレージクラスが一般的です.
これにより、すべてのストレージクラスの問題を明らかにすることができます.次に、この5つのストレージクラスを分析します.4.自動変数は自動的に変わり、キーワードautoを使用しますが、プログラムはデフォルトではコードブロックと関数のヘッダ定義がすべて自動記憶クラスなので、このautoは省略されることが多いです.例:
int main()
{
auto int i;
...
}
これは私たちが普段変数iを直接宣言しているのと同じですが、autoの多くは省略されています.5.レジスタ変数ここではレジスタについて言及し、レジスタもデータを格納するハードウェアであり、メモリよりも高速であるため、多くの場合、私たちが書いたプログラムはコンパイラによってレジスタに格納され、プログラムの実行速度が速くなる.したがって、レジスタとメモリは別々の2つのものであり、レジスタ変数はレジスタに格納され、一般的には速度を最適化するために使用されるが、レジスタ変数はメモリに開かれていないため、アドレスを取ることができないことに注意しなければならない.6.外部リンクを持つ静的変数まず、これは静的変数であることを知っておく必要があります.静的変数については、静的とは、格納方式を指しますが、静的格納方式であるのは必ずしも静的変数ではありません.例えば、外部変数、彼は静的格納方式ですが、静的変数ではありません.外部リンクを持つ静的変数で、変数の定義宣言をすべての関数の外に置く.すなわち、外部変数を作成し、参照するときにexternキーワードを使用して再宣言する.
#include<stdio.h>
int val = 10;
int main()
{
extern int val;
...
return 0;
}
このコードでは、main()関数がvalを参照するときに、前にexternキーワードが付けられていることが明らかになります.これは、main関数の外にvalという変数が定義されているためです.この変数は外部リンクを持つ静的変数であり、externが漏れたら独立した変数になり、main関数に再び空間を開いて操作するからです.上記の例のvalのような外部変数では、初期化しないと自動的に0が割り当てられます.外部変数についても制限があり,名前をつける際には局所環境のルールを守らなければならない.またexternを使用して外部定義を行わないでください.例:
extern char per = 'Y';
extern知識は変数を参照し、定義できないことを明らかにします.
7.内部リンクを持つ静的変数.この変数は関数の内部で定義され、staticキーワードを使用しているため、1つのファイルでしか操作できません.例:
static int max = 10;
int main()
{
...
}
彼の参照は依然としてストレージクラスの説明子externを使用して変数を再宣言します.例:
static traveler = 1;
int spot = 2;
int main()
{
extern int travler;
extern int spot;
}