【问题标题】:Object type identification using pointers in C++在 C++ 中使用指针识别对象类型
【发布时间】:2016-10-29 03:48:29
【问题描述】:

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

我的问题是,如果我创建了一个名为 myObj 的对象并且我有一个指向 myObj 的指针,那么我能否从指针中看出它指向的对象是一个名为 myObj 的对象?还是只会说指针指向非原始数据类型?

【问题讨论】:

  • 我最近了解到指针是两个东西,一个内存地址和一个类型 -- 什么?您是从哪里获得这些信息的?
  • @PaulMcKenzie 可以在任何地方,这是常识。但是第二句话不是从第一句话开始的。
  • @M.M 是的,第二句话是可疑的。除非您已经知道类型是什么,否则无法确定指向原始类型的指针。
  • 指针只窃取被指向的内容。我认为您可能将 C++ 与 Java 内部混淆了?不管怎样,不管是谁告诉你的......
  • 指针是内存中的地址。它只包含那个地址。指针可以归因于包含指向某种类型数据的指针,但不包含该信息。

标签: c++ pointers


【解决方案1】:

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

指针的类型表示它包含的地址。因此,指向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】:

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

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

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

【讨论】:

    【解决方案3】:

    给定一个名为MyObj的类

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 1970-01-01
      • 2022-01-11
      • 2011-09-13
      • 2011-05-04
      • 2016-12-27
      • 2021-07-02
      • 2023-02-09
      • 2021-09-18
      相关资源
      最近更新 更多