2012-06-14 34 views
0

我對C++中指針算術的行爲感到困惑。我有一個數組,我想從當前的元素前進N個元素。由於在C++中指針是BYTES中的內存地址,因此代碼爲newaddr = curaddr + N * sizeof(mytype)對我來說似乎合乎邏輯。它雖然產生了錯誤;後來我發現newaddr = curaddr + N一切正常。爲什麼這樣?如果它真的是地址+ N而不是地址+ N * sizeof?我的代碼C++中的指針運算使用sizeof(type)增量而不是字節增量?

部分,其中我注意到它(2D陣列分配爲一個塊的所有存儲器):

// creating pointers to the beginning of each line 
if((Content = (int **)malloc(_Height * sizeof(int *))) != NULL) 
{ 
    // allocating a single memory chunk for the whole array 
    if((Content[0] = (int *)malloc(_Width * _Height * sizeof(int))) != NULL) 
    { 
     // setting up line pointers' values 
     int * LineAddress = Content[0]; 
     int Step = _Width * sizeof(int); // <-- this gives errors, just "_Width" is ok 
     for(int i=0; i<_Height; ++i) 
     { 
      Content[i] = LineAddress; // faster than 
      LineAddress += Step;  // Content[i] = Content[0] + i * Step; 
     } 
     // everything went ok, setting Width and Height values now 
     Width = _Width; 
     Height = _Height; 
     // success 
     return 1; 
    } 
    else 
    { 
     // insufficient memory available 
     // need to delete line pointers 
     free(Content); 
     return 0; 
    } 
} 
else 
{ 
    // insufficient memory available 
    return 0; 
} 
+0

您是否使用語言說明進行檢查? –

+0

在那裏發現指針有一個內存地址作爲字節偏移量(即內存中的第N個字節)。這就是爲什麼它看起來像一個數字+ 1 =下一個字節。 –

+0

@fynjyzn - 不,「number + 1」是*不一定是「下一個字節」。只有當「數字」恰好是「char」(或「unsigned char」)時纔會如此。 – paulsm4

回答

1

A「指針」指向一個位置

當你「增加」時,你想要去下一個,相鄰的位置。

問:「下一步」,「相鄰」取決於大小你指向的對象的,不是嗎?問:當你不使用「sizeof()」時,一切正常,更正嗎?爲什麼?你認爲編譯器爲你做了什麼,「背後」?

問:如果您添加自己的「sizeof()」,您認爲應該發生什麼?

之上的了「一切正常」的情況?

+0

好的,謝謝。我認爲,如果一個指針是內存中的一個字節數,那麼向它添加一個指針將指向下一個字節(並可能產生訪問衝突)。 –

2

推理中的錯誤就在這裏:「由於C++指針是BYTES中的內存地址,[...]」。

A C/C++指針以字節爲單位的存儲器地址。當然,它由一個內存地址來表示,但是你必須區分一個指針類型和它的表示。操作「+」是爲某種類型定義的,而不是其表示形式。因此,當它被稱爲int *類型時,它尊重這種類型的語義。因此,類型int *上的+ 1將使指針前進的字節數與底層的int類型表示形式使用的字節數相同。

你當然可以投你的指針,像這樣:(int)myPointer。現在您有一個數字類型(而不是指針類型),其中+ 1將按照您對數值類型的預期工作。請注意,投射後,表示保持不變,但類型會改變。

1

指針指向地址,因此將指針p遞增N將指向p的第N個內存塊。現在

,如果你使用的地址,而不是指向的地址,然後它會增加N *的sizeof(類型)是合適的。