C ++中向量obj的地址是什么?

时间:2012-07-27 09:57:19

标签: c++ vector memory-address

请参阅以下代码:

#include <vector>
#include <iostream>
int main(int argc, char *argv[]) {
  std::vector<double> obj(10,0);
  std::cout << &obj << std::endl;
  std::cout << &obj[0] << std::endl;
}

我想知道这两个地址之间的区别&amp;谢谢! 据我所知,对于像a[5]这样的数组,&a&lt; =&gt; &a[0]&lt; =&gt; a

4 个答案:

答案 0 :(得分:7)

&obj是向量本身的地址,而&obj[0]是向量内部数据的地址。 数组只是存储在其中的数据,因此数组的地址实际上与数据的地址相同,而vector在堆上分配其内部数据。

答案 1 :(得分:2)

也许这有帮助

struct MyVector
{
  double* data;
};

int main
{
  MyVector obj;
  cout << &obj << std::endl;
  cout << obj.data << std::endl;
}

显然(我希望)这两个指针是不同的。它和std :: vector一样。

答案 2 :(得分:1)

&amp; obj是堆栈上向量的地址。它的类型是“指向矢量的指针”(std :: vector *)。而&amp; obj [0]是存储在向量中的第一个双精度型的地址,其类型为“指向双精度”(double *)。

答案 3 :(得分:1)

我觉得你误解了std :: vector和数组之间的基本区别。我的意思是,例如

int i_array [ 5 ] = { 0 };

不是矢量。向量是一个类,i_array只是指向数组第一个整数的指针。 (并且在指针上使用[]与在矢量对象上使用[]不同) 在使用vector的[]运算符时,您只是访问该类的函数,该函数返回对由类向量管理的数组的第一个整数(或在您的情况下为double)的引用。

所以&amp; obj为你提供了矢量实例的指针,你的对象是“this”,而&amp; obj [0]首先调用operator [],它返回对数组第一个条目的引用,与&amp;你得到它的地址。