型修飾子は型名と派生型を変更します。派生型は C の宣言の一部であり、何度も適用することによって、より複雑な型 (ポインタ、配列、関数、構造体、共用体) を構築できます。関数を除き、1 つまたは両方の型修飾子を使用すると、派生型の動作を変更できます。
この例は、型が const int であり、値が正しいプログラムによって変更されないオブジェクトを宣言し、初期化します。
const int five = 5;
キーワードの順番は C にとって重要ではありません。たとえば、次の宣言は、最初の例と効果の点で同じです。
int const five = 5;
const five = 5;
次の宣言は、以前に宣言したオブジェクトを初期状態で指す、const int 型のポインタのオブジェクトを宣言します。
const int *pci = &five;
このポインタ自身は修飾型を持ちませんが、そのポイント先が修飾型になっています。そのポイント先はプログラムの実行中、基本的に任意の int に変更可能です。pci を使用してそのポイント先のオブジェクトを変更することはできません。ただし、次の例のようにキャストを使用すれば可能です。
*(int *)pci = 17;
pci が実際に const オブジェクトを指す場合、このコードの動作は未定義です。
次の宣言は、int への const ポインタという型を持つ大域オブジェクトの定義が、プログラム内のどこかに存在することを示しています。
extern int *const cpi;
この場合、正しいプログラムでは cpi の値は変更されません。しかし、cpi を使用して、cpi が指すオブジェクトを変更することはできます。この宣言において、const が * のあとにあることに注意してください。次の 2 つの宣言の効果は同じです。
typedef int *INT_PTR; extern const INT_PTR cpi;
前述の宣言は、次の宣言のように連結できます。この場合、オブジェクトの型は const int への const ポインタであると宣言されます。
const int *const cpci;