ポインタには2種類の情報が含まれているとは言い難いです。一般的に言えば、ポインタ(任意の変数のように)には、型と値という2つのプロパティがあります。
ポインタのタイプは、そのアドレスを含むものを示します。したがって、int
(別名int *
)へのポインタには、int
のアドレスが含まれています。
ポインタの値は、実際のオブジェクトのアドレスです。これは、ポインタに含まれる情報です。
ポインタの型情報と値を使用して、ポインタが指すオブジェクト(または変数)に対して許可された操作を実行することができます。
たとえば、
int i;
int *p = &i; // p is of type int *, so points at an int.
// This initialisation gives p a value which is the address of i
*p = 42; // p points at i, *p refers to i, so this statement sets i to be 42
上記にはいくつかの例外がありますが、
void
ポインタ(別名void *
)にはタイプ情報が含まれていませんが(void
は、このコンテキストでは「タイプがありません」という意味です)、値を持っています。
int i;
void *p = (void *)(&i);
*p = 42; // invalid, since p is a void * - it could point at anything
ポインタが初期化されていない(初期値なしで定義されているなど)可能性があります。その場合、その値にアクセスすると、未定義の動作が発生します。ポインタが指しているものにアクセスするためには、ポインタ自体の値にアクセスする必要があります。
ポインタは、NULL
または(これに相当するC++ 11以降の)値nullptr
で初期化または割り当てられます。これは、ポインタにオブジェクトのアドレスが含まれていないことを示す特別な値です。このような存在しないオブジェクトにアクセスすると、未定義の動作も発生します。
状況はclass
/struct
タイプではさらに複雑です。たとえば、多態型へのポインタには、その型の任意のオブジェクトのアドレスと、そこから派生した任意の型のアドレスを含めることができます。
*私は最近、ポインタがメモリアドレスとタイプの2つのものであることを知った* - 何?あなたはどこからこの情報を入手しましたか? – PaulMcKenzie
@PaulMcKenzieはどこにでも置くことができます。しかし、2番目の文は最初の文に続くものではありません。 –
@ M.Mはい、2番目の文は疑わしいものです。プリミティブ型へのポインタは、その型が何であるかを既に知っていなければ決めることができません。 – PaulMcKenzie