まず、スコープ
1.1適用範囲
ブロックスコープを有するブロック内の変数の定義は、ブロックは、中括弧のコード領域内に封入されています。
1.2関数のスコープ
ラベルのみのgoto文に関数スコープ。
1.3関数プロトタイプスコープ
関数プロトタイプスコープの範囲は、端からプロトタイプ宣言書への参照を定義することです。この手段は、関数プロトタイプのパラメータのみのタイプに対処するコンパイラの懸念は、2つのパラメータの名前は、通常は無関係であること。さらに、でも物理パラメータ名と、パラメータが関数定義の名前と一致していません。唯一の可変長配列、唯一のパラメータ名。例えば:ボイドuse_a_VLA(整数nは、整数 Mは、Ar [n]は[M])
1.4ファイルスコープ
関数の外の変数の定義は、ファイルスコープを持ちます。そのような変数は、複数の機能のために使用することができ、それはまた、グローバル変数として知られています。
1.5翻訳単位
Cプリプロセッサの#includeコマンドは、実際には、ヘッダファイルに含まれるコンテンツで置き換えられます。したがって、コンパイラソースコードとヘッダファイルの全ては、このファイルを翻訳単位と呼ばれ、情報を含む単一のファイルとみなされます。
第二に、リンク
2.1ノーリンク
スコープ、関数または関数プロトタイプスコープのスコープ変数を有するブロックには、変数を連鎖されていません。
2.2リンク
変数はファイルスコープは、内部または外部リンクリンクすることができています。
2.2.1内部リンク
内部リンク変数は翻訳単位としても知られている内部リンクファイルのスコープで使用可能な「ファイルスコープ。」
2.2.2外部リンク
外部リンク変数は、複数のファイル、また、「グローバルスコープ」またはとして知られている外部リンクファイルのスコープで使用することができる「スコーピング。」
第三に、保存期間
3.1自動保存期間
**ブロックスコープ変数は、一般的に自動保存期間を持っています。プログラムは、これらの変数のブロック定義に入ると**、それはあなたがブロックを終了するときに、ちょうど変数に割り当てられたメモリを解放し、これらの変数のメモリを割り当てます。
3.2静的記憶期間
静的記憶域期間を持つファイルスコープ変数。
注:静的なキーワードではなく、保存期間よりも、そのリンクの属性を示します。内部の静的キーワードのリンクがあります。
3.3スレッドの保存期間
オブジェクトは、スレッドの端からスレッド保管期間が存在していたと宣言されています。
メモリの3.4動的な割り当て
変数の割り当て機能割り当てメモリを使用します。
第四に、ストレージカテゴリ
4.1概要
ストレージクラス | 保管期間 | スコープ | リンク | 宣言的 |
---|---|---|---|---|
オートマチック | オートマチック | ブロック | ノー | ブロック |
登録 | オートマチック | ブロック | ノー | ブロック、キーワードレジスタ |
静的外部リンク | 静的な状態 | ファイル | 外部 | すべての外部関数 |
静的な内部リンク | 静的な状態 | ファイル | 内部 | すべての関数の外では、キーワードを使用して静的 |
スタティックリンクなし | 静的な状態 | ブロック | ノー | インサイド速く、キーワード静的を使用 |
4.2特性
4.2.1レジスタ変数
最速の利用可能なメモリに格納された自動可変レジスタ変数に比べ。レジスタ変数レジスタの存在ではなく、メモリのために、あなたがアドレスレジスタ変数を取得することはできませんので。
レジスタ変数タイプが制限されるレジスタは、64ビットの変数を格納するための十分なスペースではないかもしれないので、宣言することができます。
4.2.2静的変数
静的変数ではなく、その値そのままよりも、動かないメモリ現場です。
静的変数静的変数、静的変数、外部リンク、静的変数の内部リンクのブロックがあります。
例:
#include <stdio.h>
int staticdemo(void);
int main(void)
{
int i;
for(i = 0; i < 10; i++)
printf("%d ", staticdemo()); //调用声明静态变量的函数
/*运行结果
1 2 3 4 5 6 7 8 9 10
*/
return 0;
}
int staticdemo(void)
{
static int demo = 0; //声明静态变量
return ++demo;
}
結果:
最初の呼staticdemoにおけるステートメント()と静的変数は0に初期化され、そして機能が呼び出された後にメモリ位置の量を直接使用することができるので、次に、デモ、初期化されていないであろう。
4.2.3静的変数の外部リンク
ソース外部変数は、ソースコードファイルで使用される別のファイルに定義されている場合は、変数が宣言されているのexternそのファイルを使用する必要があります。
/*file1.c*/
int exVal = 100;
int exVal2 = 200;
/*file2.c*/
#include <stdio.h>
#include "file1.c"
int main(void)
{
extern int exVal;
int exVal2 = 50
printf("exVal = %d \n", exVal);
printf("exVal2 = %d \n", exVal2);
return 0;
}
/*运行结果
exVal = 100
exVal2 = 50
*/
結果:
exValをexternキーワードを使用し、出力値がfile2.cを定義しているように、出力値はFILE1.Cを定義し、exVal2はないにexternキーワードを使用します。
引用されたとして定義されたスタイルの声明、二文と最初の文では、唯一の定義は、変数を初期化するために宣言したことを宣言しました。
4.2.4静的変数の内部接続
外部変数の正常な機能は、任意の統一されたプログラムファイルで使用することができますが、内部リンクの静的変数は、ファイルのみで機能することができます。
例:
#include <stdio.h>
static int a = 100;
int main(void)
{
printf("static val a = %d \n", a);
return 0;
}
/*输出结果
static val a = 100
*/
4.2.5動的記憶変数
Cは、プログラム実行中に、我々はまた、メモリを割り当てるためのmalloc()関数を使用することができ、より多くのメモリ(例えば、可変長配列)を割り当てることができます。malloc()は最初のバイトの動的に割り当てられたメモリブロックのアドレスを返します。従って、アドレスポインタに割り当てられており、このメモリにアクセスするためのポインタを使用することができます。チャーは、バイトとして表さのmalloc()は通常チャーへの戻り型ポインタとして定義され、次いで所望の順番にキャストを入力します。
例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0;
double * ptd = (double *) malloc(5 * sizeof(double)); //声明 5 个空间的double数组
int * pti = (int *) malloc(3 * sizeof(int)); //声明 10 个长度的int数组
printf("enter 5 num to assign double arry: \n");
while (i < 5 && scanf_s("%lf", &ptd[i]) == 1) //获取 double 输入
i++;
printf("here are double arry: \n");
for (i = 0; i < 5; i++) //输出
printf("%7.2f", ptd[i]);
printf("\n");
free(ptd);
i = 0;
printf("enter 3 num to assign int arry: \n");
while (i < 3 && scanf_s("%d", &pti[i]) == 1) //获取 int 输入
i++;
printf("here are int arry: \n");
for (i = 0; i < 3; i++) //输出
printf("%d ", pti[i]);
free(pti);
return 0;
}
/*运行结果
enter 5 num to assign double arry:
9 10 4.4 8.9 10
here are double arry:
9.00 10.00 4.40 8.90 10.00
enter 3 num to assign int arry:
4 9 10
here are int arry:
4 9 10
*/
参考図書
Cプライマープラス(第6版)中国語版