c++中使用指针的对象类型标识

Object type identification using pointers in C++

本文关键字:对象 类型 标识 指针 c++      更新时间:2023-10-16

我最近了解到指针包含两种类型的信息:内存地址和它们所指向的类型。我知道如果我有一个指针,那么我就可以判断它指向的对象是整型还是双精度,还是其他基本数据类型。

我的问题是,如果我创建一个名为myObj的对象,我有一个指向myObj的指针,那么我可以从指针中知道它指向的是一个名为myObj的对象吗?还是说指针指向非基本数据类型?

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

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

指针有一个类型,但它不是一个类型,该类型必须匹配你返回的obj。

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

返回myObj类型。更多信息:http://en.cppreference.com/w/cpp/language/typeid

给定一个名为MyObj的类

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

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

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