使用C ++中的指针识别对象类型

时间:2016-10-29 03:48:29

标签: c++ pointers

我最近了解到指针包含两种类型的信息:内存地址和它们指向的类型。 所以我知道如果我有一个指针,那么我可以判断它指向的对象是int还是double或任何其他原始数据类型。

我的问题是,如果我创建一个名为myObj的对象,并且我有一个指向myObj的指针,那么我可以从指针告诉它指向的东西是一个名为myObj的对象吗?或者只是说指针指向非原始数据类型?

3 个答案:

答案 0 :(得分:3)

说指针包含两种类型的信息是不正确的。一般而言,指针(与任何变量一样)有两个属性:类型和值。

指针的类型表示它包含的地址。因此,指向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近似意味着“在此上下文中没有类型”)但确实有值。< / p>

  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类型的事情更复杂。例如,指向多态类型的指针可以包含该类型的任何对象的地址,以及从中派生的任何类型。

答案 1 :(得分: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

答案 2 :(得分:0)

给定一个名为MyObj

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

指针类型为type MyObj,如果MyObj下有继承类,它将指向MyObj类型或派生类型。

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

return 0;
}