C ++指向矢量行为的指针

时间:2016-12-12 23:55:38

标签: c++ arrays pointers vector

我知道在矢量上使用原始指针并不是最好的方法,因为它们很聪明, 但我的问题只是一个可以理解我无法绕过的东西的问题...... 如果我创建一个向量,然后是指向它的指针:

    vector<int> vec = {1,2,3,4,5};
    vector<int> *ptr = &vec;
  1. 为什么我需要使用引用运算符& 而阵列不需要它? (不是矢量动态数组)
  2. 为什么我写cout<<*ptr<<endl;,编译器出错,我必须写cout<<(*ptr)[1]<<endl;cout<< ptr->at(1) ??
  3. 通常,如果您创建指向数组的指针,指针指向第一个元素。

    你能帮我理解什么样的动物载体吗?

2 个答案:

答案 0 :(得分:2)

  

为什么我需要使用引用运算符(&amp;)而不是数组   不需要它吗?(不是动态数组的矢量)

与您所做的相同,使用数组是:

int array[] = {1,2,3,4,5};
int (*ptr)[5] = &array; // less constrained to just 5 elements with vectors

所以你还需要&运营商;

  

为什么我写cout<<*ptr<<endl;,编译器给出了错误,我必须这样做   写cout<<(*ptr)[1]<<endl;cout<< ptr->at(1) ??

因为向量是对象而且*运算符没有被重载以返回除向量本身之外的任何有用的东西。

你可能想要做的是使用向量的std::vector::data函数,它给你一个指向向量使用的底层数组的指针。

答案 1 :(得分:1)

  

不是矢量动态数组)

概念上是,实施明智,不。矢量实例是std::vector <sometype>类型的对象。如果要获取像向量实例之类的对象的地址,则需要使用address-of,aka &,operator。向量与c ++数组相同。

  

为什么我写cout<<*ptr<<endl;,编译器给出错误

因为std :: vector不支持通过运算符&lt;&lt;

进行流式传输。

编辑:

如果你真的想要访问内部数组,你可以这样做:

vector <int> v = // whatever
int * ip = &v[0];

或:

int * ip = v.data();