指向向量的指针是如何工作的?

How does a pointer to a vector work?

本文关键字:工作 何工作 向量 指针      更新时间:2023-10-16

如果我有以下内容:

vector<int> v(4,0);
vector<int>* p = &v;
int element = p[0];

元素的值是否与v[0]相同?

我对[]操作符有点困惑。

简短的回答:no.

你所拥有的甚至不是有效的c++。p[0]*p相同,为vector<int>型,因此不能转化为int

[] -符号仅仅表明您将p视为向量的数组,并且您正在访问数组的第一个元素,即v。更一般地说,对于任何指针p,符号p[k]都与*(p + k)相同(实际上是错误的,因为您可以互换地说a[5]5[a])。

所以,如果你真的想,你可以为向量的第i个元素写p[0][i],尽管更习惯的是只写(*p)[i](需要括号来表示正确的优先级)。


当我第一次浏览这个问题时,我认为你可能在寻找一些聪明的hack,想知道**(int**)(p)是否等于v[0]。这确实是合理的,因为vector数据结构的第一个元素通常是指向vector内部缓冲区的指针。

对于任意指针p, p[0]*p相同。(更一般地说,p[i]*(p+i)的特殊表示法。有趣的事实:你也可以写i[p],因为*(p+i) == *(i+p)。C和c++就很奇怪。)所以在你的例子中,p是指向v的指针,你实际上写的是int element = v;。这是不行的,因为右边是一个向量

不,p它是指向向量的指针,而不是指向内容!如果你尝试编译,你会得到类似

的东西
error: cannot convert ‘std::vector<int>’ to ‘int’ in initialization

从你的编译器。使用(*p)[0]获取值