ポインター宣言では、ポインター変数に名前を付け、変数が指すオブジェクトの型を指定します。 ポインターとして宣言された変数は、メモリ アドレスを保持します。
構文
declarator:
pointer
選ぶdirect-declarator
direct-declarator:
identifier
(
declarator
)
direct-declarator
[
constant-expression
選ぶ]
direct-declarator
(
parameter-type-list
)
direct-declarator
(
identifier-list
選ぶ)
pointer:
*
type-qualifier-list
選ぶ
*
type-qualifier-list
選ぶpointer
type-qualifier-list:
type-qualifier
type-qualifier-list
type-qualifier
type-specifierはオブジェクトの型を提供します。オブジェクトの種類は、基本型、構造体型、または共用体型のいずれかになります。 ポインター変数は、関数、配列、およびその他のポインターを指すこともできます。 (より複雑なポインター型の宣言と解釈については、「 より複雑な宣言子の解釈」を参照してください)。
type-specifier
voidにすると、ポインターが参照する型の指定を遅らせることができます。 このような項目は" voidへのポインター" と呼ばれ、 void *として書き込まれます。
voidへのポインターとして宣言された変数は、任意の型のオブジェクトを指すために使用できます。 ただし、ポインターまたはポインターが指すオブジェクトに対してほとんどの操作を実行するには、そのポインターが指す型を操作ごとに明示的に指定する必要があります。 (型 char * と型 void * の変数は、型キャストなしで代入互換です)。このような変換は、型キャストを使用して実行できます。 詳細については、「 Type-Cast 変換」を参照してください。
type-qualifierには、constまたはvolatile、またはその両方を指定できます。 これらのキーワードは、それぞれ、ポインターをプログラム自体で変更できないこと (const)、またはポインターがプログラムの制御を超える何らかのプロセス (volatile) によって正当に変更できることを指定します。
constとvolatileの詳細については、「型修飾子」を参照してください。
declaratorは変数に名前を付け、型修飾子を含めることができます。 たとえば、 declarator が配列を表す場合、ポインターの型は配列へのポインターに変更されます。
構造体、共用体、または列挙型を定義する前に、構造体、共用体、または列挙型へのポインターを宣言できます。 例に示すように、構造体または共用体タグを使用してポインターを宣言します。 このような宣言は、ポインター変数にスペースを割り当てるために構造体または共用体のサイズをコンパイラが認識する必要がないために許可されます。
例示
次の例は、ポインター宣言を示しています。
char *message; /* Declares a pointer variable named message */
message ポインターは、char型の変数を指します。
int *pointers[10]; /* Declares an array of pointers */
pointers配列には 10 個の要素があります。各要素は、int型を持つ変数へのポインターです。
int (*pointer)[10]; /* Declares a pointer to an array of 10 elements */
pointer変数は、10 個の要素を持つ配列を指します。 この配列内の各要素には int 型があります。
int const *x; /* Declares a pointer variable, x,
to a constant value */
ポインター x は、別の int 値を指すよう変更できますが、そのポインターが指す値は変更できません。
const int some_object = 5 ;
int other_object = 37;
int *const y = &fixed_object;
int volatile *const z = &some_object;
int *const volatile w = &some_object;
これらの宣言で y 変数は、 int 値への定数ポインターとして宣言されます。 指す値は変更できますが、ポインター自体は常に同じ場所 ( fixed_objectのアドレス) を指す必要があります。 同様に、 z は定数ポインターですが、プログラムで値を変更できない int を指すよう宣言することもできます。
volatile指定子は、zが指すconst intの値をプログラムで変更することはできませんが、プログラムと同時に実行されているプロセスによって正当に変更できることを示します。
wの宣言は、プログラムが指す値を変更できないこと、およびプログラムがポインターを変更できないことを指定します。
struct list *next, *previous; /* Uses the tag for list */
この例では、構造体型listを指す 2 つのポインター変数 (nextとprevious) を宣言します。 この宣言は、list型定義が宣言と同じ可視性を持つ限り、list構造体型の定義の前に表示できます (次の例を参照)。
struct list
{
char *token;
int count;
struct list *next;
} line;
変数 line には、 listという名前の構造体型があります。
list構造体型には 3 つのメンバーがあります。1 つ目のメンバーはchar値へのポインター、2 つ目はint値、3 つ目は別のlist構造体へのポインターです。
struct id
{
unsigned int id_no;
struct name *pname;
} record;
変数 record には、構造体の型 idがあります。
pname は、 name という名前の別の構造体型へのポインターとして宣言されています。 この宣言は、 name 型が定義される前に指定できます。