2017-07-19 36 views
0

我想找出存儲器中連續向量元素位置之間的「距離」。所以我嘗試下面的代碼連續向量元素的C++指針是自相矛盾的

#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 s。然而,當我嘗試打印個別指針:

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

結果是

01485048 
0148504C 
01485050 

所以連續兩個元素之間的差異應該是4。看似與之前的結果相矛盾。這裏出了什麼問題?

+0

1.你爲什麼要這麼做? 2.你見過'++'應用於指針嗎? –

+0

@ n.m。 1.我想確保連續元素的指針也是連續的,這樣'*(&vec [i] +1)'指向'vec [i + 1]'。 2.不完全確定你的意思,但我認爲我將'++'應用於元素的索引而不是指針,儘管我認爲它也適用於指針。 – Vim

+0

所以你已經找到了你想要驗證的內容。你驚訝於'(&vec [i] +1) - (&vec [i])== 1'嗎? –

回答

1

計算兩個指針返回對象之間的數量之間的差異,你可以仔細檢查這一點 - 這就是爲什麼你不能在不同類型的兩個指針進行算術。如果您想知道它們之間的距離字節,可以將兩個指針指向char*或將減法結果乘以sizeof(your_type)

+0

謝謝。這解決了我的困惑。 – Vim

4

沒有什麼特別的vector。 C++指針算法(和迭代器算法)是根據元素完成的。實際上,vec[i+1]vec[i]是一個要素。

這裏的一個元素碰巧是4個字節,這是您在打印指針的位模式時看到的內容。與sizeof(vec[0])

+0

是的,我知道int應該有四個字節。但問題是,爲什麼第一個結果是兩個1?他們不應該是兩個4的嗎? – Vim

+0

@Vim重讀第二句答案。 – Barry

+0

@巴里好吧謝謝。我終於明白了下面答案的幫助意味着什麼。 – Vim

1

你應該投指針uintptr_t所以減法將產生於他們之間的字節數量:

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

Eww。你也可以用'sizeof(* pointer)'乘以結果,這是可移植的(並且不太醜陋,但這是主觀的) – MSalters

+0

@MSalters不是真的,想象一下當兩個指向'uint32_t'的內存塊彼此相距13個字節。 – VTT

+2

這將是非法的,因爲您不允許減去指針,除非它們都指向相同的數組。顯然,沒有'uint32_t [N]',元素之間有13個字節(暫時忽略32位字節)。 – MSalters