我想找出内存中连续向量元素的位置之间的“距离”。所以我尝试以下代码
#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
。看似与之前的结果相矛盾。这里出了什么问题?
答案 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;