连续向量元素的C ++指针是矛盾的

时间:2017-07-19 14:22:58

标签: c++ pointers vector

我想找出内存中连续向量元素的位置之间的“距离”。所以我尝试以下代码

#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec(3);
    for (int i = 0; i <= 1; i++)
    {
        cout << &vec[i+1] - &vec[i] << endl;
    }
    return 0;
}

结果不出所料是两个1。但是,当我尝试打印单个指针时:

vector<int> vec(3);
for (int i = 0; i <= 2; i++)
{
    cout << &vec[i] << endl;
}

结果是

01485048
0148504C
01485050

因此两个连续元素之间的差异应为4。看似与之前的结果相矛盾。这里出了什么问题?

3 个答案:

答案 0 :(得分:4)

Nothing particular to vector. C++ pointer arithmetic (and iterator arithmetic) is done in terms of elements. And indeed, vec[i+1] and vec[i] are one element apart.

One element here happens to be 4 bytes, which is what you see when printing the bit pattern of the pointers. You can double-check this with sizeof(vec[0])

答案 1 :(得分:1)

计算两个指针之间的差异会在它们之间返回对象数 - 这就是为什么你不能对两个不同类型的指针进行算术运算的原因。如果你想知道它们之间的字节的距离,要么将两个指针都转换为char*,要么将减法结果乘以sizeof(your_type)

答案 2 :(得分:1)

您应该将指针转换为uintptr_t,因此减法将产生它们之间的字节数:

cout << (reinterpret_cast< uintptr_t >(&vec[i+1]) - reinterpret_cast< uintptr_t >(&vec[i])) << endl;