用C ++指向向量的指针

时间:2015-10-05 08:42:01

标签: c++ pointers vector

我正在与矢量斗争。这是我的两个例子。

#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

任何人都可以解释第二次输出吗?

3 个答案:

答案 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],而对于任何np[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]时,这是您第一个程序中的情况