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