如果我有以下几点:指向矢量的指针是如何工作的?
vector<int> v(4,0);
vector<int>* p = &v;
int element = p[0];
威尔元素是相同的值作为v[0]
?我在这里对[]
运营商感到困惑。
如果我有以下几点:指向矢量的指针是如何工作的?
vector<int> v(4,0);
vector<int>* p = &v;
int element = p[0];
威尔元素是相同的值作为v[0]
?我在这里对[]
运营商感到困惑。
简答:没有。
你所拥有的甚至不是有效的C++。 p[0]
与*p
相同,其类型为vector<int>
,因此不可转换为int
。
的[]
-notation仅仅表明,您想的p
作为矢量的阵列,和要访问的数组的第一个元素,该元素是v
。更一般地,对于任何指针p
,符号p[k]
与*(p + k)
相同(实际上是错误的,因为可以互换地说a[5]
和)。
所以,如果你真的想,你可以写p[0][i]
作为向量的i
th元素,尽管只写(*p)[i]
(正确优先级所需的括号)更习惯。
当我第一次掠过的问题,我想你可能会寻找一些聪明的黑客,想知道是否**(int**)(p)
等于v[0]
。这确实是有道理的,因为矢量数据结构的第一个元素通常是指向矢量内部缓冲区的指针。不要在家中使用它。
对于任何指针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]
来获得价值。
难道不是'p->在(0)'...? (被当前答案困惑) –
@muntoo是的,你可以这样做,这个问题是误导性的,因为它提供了上面的代码,就好像它是有效的,当它不是,也不会编译。 –