2016-10-29 12 views
0

最近、ポインタに2種類の情報、つまりメモリアドレスとそれらが指す型が含まれていることがわかりました。 私はポインタを持っていることを知っているので、それが指しているオブジェクトがint型かdouble型かその他のプリミティブ型かどうかを知ることができます。C++のポインタを使用したオブジェクト型の識別

myObjというオブジェクトを作成し、myObjへのポインタを持っていたら、それが指し示すものがmyObjというオブジェクトであることをポインタから伝えることができますか?それとも、ポインタが非プリミティブなデータ型を指していると言うでしょうか?

+1

*私は最近、ポインタがメモリアドレスとタイプの2つのものであることを知った* - 何?あなたはどこからこの情報を入手しましたか? – PaulMcKenzie

+0

@PaulMcKenzieはどこにでも置くことができます。しかし、2番目の文は最初の文に続くものではありません。 –

+0

@ M.Mはい、2番目の文は疑わしいものです。プリミティブ型へのポインタは、その型が何であるかを既に知っていなければ決めることができません。 – PaulMcKenzie

答えて

3

ポインタには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タイプではさらに複雑です。たとえば、多態型へのポインタには、その型の任意のオブジェクトのアドレスと、そこから派生した任意の型のアドレスを含めることができます。

+0

explantionに感謝します –

0

MyObj

class MyObj 
{ 
private: 
    //.... 
    //.... 
public: 
    //.... 
    //.... 
}; 

という名前のクラスを考えるとポインタ型はtype MyObjであろう、そしてこのmyobjの下で継承されたクラスが存在する場合には、このmyobjタイプまたは派生型を指します。

int main() 
{ 
    MyObj obj; 
    MyObj *ptr = &obj; //adress contained in the pointer 

return 0; 
} 
1

ポインタの型を持っていますが、それがタイプではありません、タイプがあなたの帰国OBJと一致する必要があります。

#include<typeinfo> 
#include<string> 
#include<iostream> 
//.. 
//.. 
//.. 
string name = typeid(*myObj).name() 
//.. 
cout<<"Name: "<< name; 
//.. 

これはmyObjタイプを返します。 詳細については、 http://en.cppreference.com/w/cpp/language/typeid

関連する問題