C言語でconstキーワード
constのがはるかに実際のプログラミングで使用されなかった、constの定数は、「定数」を意味頭字語、です!これは、読み取り専用の変数定義されたキーワードである、またはconstキーワードは、多くの場合、変数の定義です。
constの定義は、変数が、等価で一定であると、それは定数で定義されますが、変数があるプロパティは、そう呼ばれている定数変数を。メソッドによって定義された定数CONST変数は、それのような変数の通常の定義でCONSTに先行することができ、非常に簡単です。
const int a = 10;
const int型の変数の型との両方が、すなわち、文と同じ等価であり、交換することができます。
int const a = 10;
だから、constのと旧無修正で修正した後、それはどのような違いを生むのでしょうか?彼らはすべての10に等しいんでありませんか?
変数の値は、あなたが同じ値を割り当てることができない場合でも、それは再割り当てすることはできません。**変更することはできないのconst、と定義されます。**それは読み取り専用の変数であるように定義されました。これは、定義時に初期値を与えなければならないことを意味します。
定義されたときに初期化されていない場合は、我々はローカル変数が初期化されていないため、プログラムが自動的に実行されることを知ったときに小さな負の数に店。だから、それを与えるバック与えられた最初の言葉は「その値を変更する」であり、それは、構文エラーが発生しています。
それがグローバル変数またはローカル変数であるかどうか、のconst変数によって変更、ライフサイクルは、全体のプロセスを実行しています。ライフサイクル付与のためにこれを実行するプロセス全体のためのグローバル変数。修正constのローカル変数の使用は静的な特性を持って、そのライフサイクルの全プロセスが実行されています。私たちは、静的なプログラムのライフサイクル全体が実行されている、グローバル変数が静的であることを知っています。しかし、修正constのローカル変数でのみ静的な特性を持っている、そしてそれは、静的変数になっていませんでした。
我々は、スタック内の、静的変数は静的な記憶領域に格納されていることを知っており、CONSTローカル変数は、変数にわたって修正格納するために後に「読み取り専用データセグメント」内のメモリに記憶されています。読み取り専用のデータ・ストレージ・セグメントは変更不可能な読み取り専用の変数や定数を達します。
配列の可変長されない:読み取り専用変数が定義されているがCONST、定義は定数と同等です。変数だけでなく、変数、配列の長さはまだできないように定義のconst変数読み取り専用。C ++は、C ++で使用される変数のCONST意味はアレイのCONST長さとして定義することができる延びています。
constとポインタ
CONSTポインタ変数と、それによってポインタ変数自体を制限し、一緒に使用することができ、それはデータ・ポインタを制限することができます。次のようにCONSTとポインタは、いくつかの異なる順序で使用します。
int a = 1;
int b = 2;
// 情况一
const int *p1 = &a;
int const *p2 = &a;
// 指针所指向的数据是只读的,也就是 p1、p2 本身的值可以修改(指向不同的数据),但它们指向的数据不能被修改。
// 即:
// *p1 = 3; 报错,不能修改指向的数据
// p1 = &b; 有效,可以修改变量的指向
// 情况二
int * const p3 = &a;
// 指针是只读的,也就是 p3 本身的值不能被修改;
// 即:
// p3 = &b; 报错,不能修改指向的地址
// *p3 = 3; 有效,可以修改指向地址的值
// 情况三
// 指针本身和它指向的数据都是只读的
const int * const p4;
int const * const p5;
過去からのconst変数名はポインタ変数を変更するために使用され、離れているから、変数名が近い場合には、データポインタを変更し、これまで持っている、それが指すと同時に、ポインタ変数やデータを変更するために使用されます。
constとファンクションのパラメータ
パラメータがポインタである場合CONST一般関数パラメータで使用される、ポインタ関数内のデータの変更を防止するために制限CONSTに使用することができます。例えば、機能C言語の標準ライブラリ
size_t strlen ( const char * str );
int strcmp ( const char * str1, const char * str2 );
char * strcat ( char * destination, const char * source );
char * strcpy ( char * destination, const char * source );
呼び出されたときCONST関数パラメータの使用を制限するだけでなく、修飾されたデータを防ぐことができ、また、ヒントを与えることができます。
非constとconstのキャスト
const char *
そして、char *
さまざまな種類のものであり、あなたがすることはできませんconst char *
に割り当てられたデータのタイプchar *
型の変数。逆が可能である。しかし、コンパイラは可能にchar *
するデータ型の割り当てをconst char *
変数の型。
char *
読んだことにするデータポイントと書き込み権限、およびconst char *
データだけで何の問題も発生しませんデータを削減するために、アクセス権限を読み取るために指摘したが、権限昇格のデータのリスクが発生する可能性があります。
操作はとても動作しません。
#include <stdio.h>
int main(){
const char *str1 = "a";
char *str2 = str1; // 报错,不能给const变量增加权限
return 0;
}
constの和定義
多くの人々がそれを混乱させ、CONSTを学ぶ時に違いを定義します。機能から、彼らは本当に好きですが、彼らは大幅に異なっていること:
- プリコンパイルされた命令を定義し、constの一般的な変数が定義されています。マクロが展開前段階で定義されている定義、および読み取り専用の変数のconst定義は、運用段階のコンパイルに使用されています。
- **のconst変数が定義された、と定義される定数を定義しています。**それは変数ではないので、それは、メモリを占有しない存在しないコンパイラで定義されたマクロを定義し、システム変数にメモリを割り当てます。const変数自然が、多くの場合、まだ定義された変数である、基本的な性質を持つ変数は、メモリセルの種類があり占有されています。
- ** CONST変数が定義され、オブジェクトCONSTは、データ型を定義し、オブジェクトがマクロ定義データ型ではないので、マクロ定義は、一定です。後者は機械的にのみ文字置換、セキュリティチェックの無いタイプである一方、**ので、コンパイラは、元のセキュリティチェックを入力することができます。これにより、簡単に間違って行くことになり、それが「限界の問題」または「括弧の問題。」
そして、C ++の違い
C ++では、constがメモリ空間を作成する必要はありませんし、(c)において、constが常にメモリ空間を必要とします。
C ++定数CONSTによって定義され、書き込み後のシンボルテーブル(シンボルテーブル)を、そのコンパイル時定数行う、ストレージを割り当てられない、また、読み出し動作を記憶するメモリ、例えばそれはその効率が非常に高いです。
int main(){
const int a = 2;
int* p = (int*)(&a);
*p = 30; // 直接修改const常量对应的内存空间中的值
cout<<&a<<endl;
cout<<p<<endl;
cout<<a<<endl;
cout<<*p<<endl;
}
結果:
0x7fffc7920804
0x7fffc7920804
2
30
コンパイラは、メモリ空間に読み込まれませんので、一定のconstに対応するメモリ空間のポインタの値を変更することにより、この変更は、定数の値自体には影響を与えません。これは、C ++定数畳み込み(定数折り畳み)シンボルテーブルにCONST定数来ると、メモリを割り当てることはありません。コンパイラの最適化は、直接置き換えます。
あなたは、ストレージスペースのconstの定数を使用する必要がない限り、コンパイラはスペースを割り当てることを余儀なくされますが、それでもからのconst定数値の後にシンボルテーブルには、一定のCONSTの値に影響を与えないように、読み込みます。
C言語では
int main()
{
const int a = 2;
int* p = (int*)(&a);
*p = 30;
printf("%x\n",&a);
printf("%x\n",p);
printf("%i\n",a);
printf("%i\n",*p);
return 0;
}
業績
18b1c0e4
18b1c0e4
30
30
C言語リファレンスをCONST修飾変数値ポインタによって修飾することができます。
CおよびC ++のconstの類似点と違い概要
- グローバル言語CONST Cは、読み取り専用データセグメントに格納されます。場合グローバルCONST C ++ 宣言
extern
または変数のアドレスを取得読み取り専用データセグメントコンパイラ割り当てメモリアドレスに、変数ストレージ。両方が保護された読み取り専用のデータセグメントを変更することはできません。 - Cスタック領域における言語が、ローカル変数の値によって直接変更することはできないがCONST変数CONST読み出し専用メモリが、チェックコンパイラはポインタCONST値によって間接的に修飾されたスキップしてもよいです。そして、C ++は次のとおりです。
- 基礎となるデータ型の場合、そのアドレスは、割り当てメモリを取られたときにメモリを割り当てシンボルテーブルにそれを置きます。
- 変数はのconst変数が初期化されている初期化されている場合は、基本的なデータ型の場合、それはメモリを割り当てます。
- 与えられたデータ型のので、そのようなクラスのオブジェクトとして、あなたは、メモリを割り当てます。
- C、constのデフォルトの外部接続、内部接続にC ++のconstデフォルト。C言語2つのファイルがある場合は
const int a
、時間を、コンパイラが再定義エラーを報告します。C ++では、あなたは、デフォルトではC ++のconstは内部で接続されていませんので。
参考資料
constキーワードとその役割(使用)、C言語では、説明のconst
C言語の役割をし、構文解析のconst
CおよびC ++のconstについてのいくつかの違いの