【问题标题】:C++ pointers to vectors behavior指向向量行为的 C++ 指针
【发布时间】:2017-04-27 22:55:36
【问题描述】:

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

    vector<int> vec = {1,2,3,4,5};
    vector<int> *ptr = &vec;
  1. 为什么需要使用引用运算符&amp; 而数组不需要它? (不是向量动态数组)
  2. 为什么如果我写cout&lt;&lt;*ptr&lt;&lt;endl;,编译器会报错,我必须写cout&lt;&lt;(*ptr)[1]&lt;&lt;endl;cout&lt;&lt; ptr-&gt;at(1)??

通常,如果您创建一个指向数组的指针,该指针指向第一个元素。

你能帮我了解一下什么是动物载体吗?

【问题讨论】:

  • 如果您创建了指向数组int arr[20] = {1,2,3,4,5}; int (*ptr)[20] = &amp;arr; 的指针,上述两点也不适用。
  • 向量的行为类似于动态分配的数组,在内部它们是动态分配的数组。然而,那里的关键词是“内部”。你不知道指向向量的指针也是指向第一个向量元素的指针。您可能正在获取内部大小计数器,或指向动态数组的指针,或任何数量的其他“内部”,实现定义的值。
  • 为什么我需要使用引用运算符(&)_。嗯.. 它不是引用运算符.. 它是一个 _address-of 运算符,它完全按照您的意愿 - 获取 vec 变量的地址。

标签: c++ arrays pointers vector


【解决方案1】:

为什么我需要使用引用运算符(&)而数组 不需要吗??(不是vectors动态数组)

你所做的等价于数组是这样的:

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

所以你仍然需要&amp; 运算符;

为什么如果我写cout&lt;&lt;*ptr&lt;&lt;endl;,编译器会出错,我必须 写cout&lt;&lt;(*ptr)[1]&lt;&lt;endl;cout&lt;&lt; ptr-&gt;at(1)??

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


您可能想要做的是使用向量的std::vector::data 函数,它为您提供指向向量使用的底层数组的指针。

【讨论】:

    【解决方案2】:

    不是向量动态数组)

    在概念上是的,在实施方面,不是。向量实例是std::vector &lt;sometype&gt; 类型的对象。如果要获取向量实例等对象的地址,则需要使用地址操作符,即&amp;。向量不是与 c++ 数组相同的东西。

    为什么如果我写cout&lt;&lt;*ptr&lt;&lt;endl;,编译器会报错

    因为 std::vector 不支持通过操作符进行流式传输

    编辑:

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

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

    或:

    int * ip = v.data();
    

    【讨论】:

    • 哦,是的,因为它是一个对象 INSIDE,其中实现了一个数组,您必须使用 & 和点或 -> 运算符来访问实际的数组。我做对了吗?
    • @Gian 您只需要使用这些运算符,因为您有一个指向向量的指针。大多数情况下,您不希望有指向向量的指针,或者实际上是指向其他任何东西的指针。如果您确实想访问底层数组,请参阅我的编辑。
    • Because std::vector doesn't support streaming via operator&lt;&lt; 还是应该是“因为std::cout不支持向量插入”?
    • @:Loreto 不是真的,ostreams 只支持标准库中的类型的插入(而不是其中的许多类型)。 vector 类型的向量显然不是标准库中的类型。
    猜你喜欢
    • 2019-09-10
    • 2011-08-04
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多