我正在与矢量斗争。这是我的两个例子。
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector (5);
int* p = myvector.data(); // 0 index address
*p = 10; // index 0 = 10;
++p; // index 0 to 1
*p = 20; // index 1= 20
p[2] = 100; // index 2 = 100
++p; // as p was in index 1. then ++ goes to index 2.
*p=49; // index 2 = 49,, and 100 goes on index up
std::cout << "myvector contains:";
for (int i=0; i<myvector.size(); i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
输出:(正如我在每个陈述中解释的那样)
10 20 49 100 0
但是当我评论/删除++p
&amp; *p=49;
那么为什么100仍然在向量中的3个索引上?这是令我困惑的例子。
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector (5);
int* p = myvector.data();
*p = 10; // index 0=10;
++p; // index 0 to 1
*p = 20; // index 1 = 20
p[2] = 100; // index 2 = 100
std::cout << "myvector contains:";
for (int i=0; i<myvector.size(); i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
输出:
10 20 0 100 0
任何人都可以解释第二次输出吗?
答案 0 :(得分:8)
p[2] = 100; // index 2 = 100
中的评论错误,因为p
已经位于索引1
,因此p[2]
是索引3.
p[2]
相当于*(p + 2)
。
答案 1 :(得分:0)
我不太明白为什么你会相信
的结果p[2] = 100;
取决于事后发生的事情,但无论如何......
我将介绍一个额外的变量,可以用作矢量开始的参考点 请参阅注释以获得解释。
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector (5);
int* start = myvector.data() // Reference point
int* p = myvector.data();
*p = 10; // Equivalent to p[0] = 10 and start[0] = 10
++p; // p is now start + 1
*p = 20; // Equivalent to p[0] = 20 and start[1] = 20
p[2] = 100; // Since p == start + 1, this is equivalent to start[3] = 100
++p; // p is now start + 2
*p=49; // Equivalent to p[0] = 49 and start[2] = 49
std::cout << "myvector contains:";
for (int i=0; i<myvector.size(); i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
}
答案 2 :(得分:0)
在int* p = myvector.data();
之后直线,*p
指的是myvector[0]
,而对于任何n
,p[n]
指的是myvector[n]
。您可以将内存位置视为列,每个列具有等效名称,如下所示:
myvector[0] myvector[1] myvector[2] myvector[3] myvector[4]
p[0] p[1] p[2] p[3] p[4]
*p
但是,当您执行++p
时,您会转移到p
点,因此p[0]
所在的位置以及所有其他索引访问位置:
myvector[0] myvector[1] myvector[2] myvector[3] myvector[4]
p[-1] p[0] p[1] p[2] p[3]
*p
这就是为什么第二个程序中的p[2] = 100
会影响myvector[3]
。
FWIW,如果你做了一秒++p
,你有:
myvector[0] myvector[1] myvector[2] myvector[3] myvector[4]
p[-2] p[-1] p[0] p[1] p[2]
*p
(当您使用*p=49;
设置myvector[2]
时,这是您第一个程序中的情况