2011-01-24 101 views

回答

11

指針的運算是在指針的靜態類型[*]的大小上執行的,所以它會有效地添加sizeof *ptr。對齊的成員將被視爲對象的大小,作爲類型的對齊(對象末尾的填充)。

struct test { 
    int a; 
    char b; 
}; 

test大小將不會被5(假設32個整數),如果類型是對齊的4個字節。

[*]注意,在C++可以分配一個派生對象的基類的地址,但指針運算將上,而不是實際的對象的類型的指針的操作:

struct base { int x; }; 
struct derived : base { int y; }; 
int main() { 
    base * p = new derived[10]; 
    base * q = p+1;    // this does not point to the second `derived`!!! 
} 
+1

+1用於說明與基本/派生轉換相關的指針運算問題。 – 2011-01-25 07:16:22

1

對於指針算術的工作,它必須指向sizeof(any_type)+基地址。

4
  1. 的sizeof(any_type)後的ptr
  2. malloc的返回合適的存儲器用於對準任何類型的數據
  3. 簽名之間沒有差別/無符號
4

編譯器將替代一個1到相應的數的字節。您所要做的就是指定要移動到的對象的數量。

2

當你看到一個指針時,試着忘記它有一個標量值。相反,可以認爲指針是一種令牌,可以訪問存儲在連續空間(內存)中的對象。如果ptr是一個指針,它允許您訪問某個(任意)位置的對象,則ptr+1ptr-1將返回指向您的鄰居的指針。

相關問題