对象指针指向什么?

时间:2014-05-05 14:14:59

标签: c++ pointers

正如许多学生试图学习c ++的情况一样,我对指针,特别是指向对象的指针有点困惑。

一个简单的指针,如

int *x = new int(5);

很容易理解,因为x只存储了存储int 5的单词的地址。

但是,如果我们有像

这样的东西呢
 MyClass *x = new MyClass();

在这种情况下,x不能指向包含MyClass实例的单词,因为它可能比单词大。

所以问题是对象指针在内存中实际指向了什么?

3 个答案:

答案 0 :(得分:2)

对于对象,就像数组一样,它指向数据结构中包含的第一个元素。指针只能指向内存中的一个地址。它们不存储比此值更多的信息。是什么让它们看起来像你可以指向更大的类型只是编译工作。实际上,它甚至代表内存中需要4个字节的整数。 int指针只指向所述数据结构的第一个字节,编译器将根据sizeof(T)运算符的结果在需要时负责加载适量的内存。

例如,sizeof(int)返回4,这是存储整个int值所需的内存中的字节数。如果您创建一个指向int的指针,它将使用32或64位长的地址引用这4个字节中的第一个,具体取决于您的目标处理器(x86架构)。如果对象MyClass包含3个整数和1个双精度,则sizeof(MyClass)运算符将返回20 (3 * 4 + 8)。同样,指向MyClass的指针只会指向使用32位或64位地址的第一个字节。

整个CPU架构中指针的大小保持不变。如果你的CPU可以分配8位内存,你的指针将是一个字节长。换句话说,sizeof(T*) == sizeof(unsigned char)。在x86_64目标体系结构上,指针的大小为64位,因此为sizeof(T*) == sizeof(long long)

答案 1 :(得分:1)

MyClass *x = new MyClass();

在这种情况下,x将存储长度​​为sizeof(MyClass)的内存块的地址。

另一种用途:

Myclass *y = new (0x11111122) MyClass();

在这种情况下,y将存储0x11111122,这是一个已初始化新MyClass实例的地址(此示例很可能会使您的应用程序崩溃,因为您可能会破坏此地址内存中的任何内容)。

答案 2 :(得分:0)

如果您要更改此短语中的一个单词

  

x只存储存储int 5

的单词的地址

然后我希望它会很清楚

  

x只存储存储int 5或MyClass()的内存的地址;

Operator new使用sizeof( int )sizeof( MyClass )的值来分配足够的内存。例如,sizeof(long long)通常大于mashine单词的sizeof。

此外,即使对于整数,这些大小例如等于4个字节,编译器实际上可以分配16个字节而不是4个字节。实现定义了将分配多少内存。考虑到您可能会重载分配内存的新函数。

考虑C ++标准中的以下引用

  

6除非对象是位字段或基类子对象为零   size,该对象的地址是它的第一个字节的地址   占据。