2009-06-22 50 views
1

我無法理解以下代碼,我希望在堆上創建一個數組並填充字符9到0(我知道我可以只是指數像[]符號正常的堆疊陣列排列要做到這一點,但我做這種方式,試圖瞭解更深入的指針):在堆上創建數組並使用指針尋址它們

int *ptrHeapArray = new int[10]; 

    for(int f=9; f>=0 ;f--) 
    { 
     *ptrHeapArray = f; 
     ptrHeapArray++; 
    } 
    for(int f=0; f<10; f++) 
     cout << ptrHeapArray[f] << "\n"; 

它打印出compleletly意外的值。

正如我所理解的,'new'命令在堆上創建一個數組,然後向我發回一個指向數組所在地址的指針。由於我分配的指針(ptrHeapArray)是int大小的,我假設我可以使用指針後增加來瀏覽數組。但結果表明我的假設是錯誤的。

這讓我想到,'new'關鍵字返回的指針可能只是一個指向整個數組的指針,因爲某些原因無法用來遍歷數組。 所以,我想創造另一個指向由new關鍵字返回的指針,並使用了做我的數組人羣:

int *ptrHeapArray = new int[10]; //array to hold FRANK data in 32 bit chunks 
int *ptrToHeapArrayPointer = ptrHeapArray; 

for(int f=9; f>=0 ;f--) 
{ 
    *ptrToHeapArrayPointer = f; 
    ptrToHeapArrayPointer++; 
} 
for(int f=0; f<10; f++) 
    cout << ptrHeapArray[f] << "\n"; 

這工作得很好。 任何人都可以向我解釋爲什麼我必須這樣做,不能只使用通過'新'關鍵字支持給我的指針?

感謝

回答

6

ptrHeapArray++; 
在你的第一個for循環

遞增指針,例如,它不指向數組的開始了。

int *ptrHeapArray = new int[10]; 

分配到內存的開始10個整數點ptrHeapArray內存。在for循環中,然後移動這個指針。當ptrHeapArray指向整數第三:

[0] [1] [2] [3] [4] 
^  ^ ^
orig. |  | 
     |  +-- ptrHeapArray[2] 
     | 
     +-- ptrHeapArray now points here 

然後ptrHeapArray [2]會給你用4

+0

它基本上破壞了陣列的頭部 – 2009-06-22 11:58:19

4

您正在修改代碼中的指針orignally編號位置的整數。在第一個片段中的第一個循環之後,指針將指向數組的結尾而不是開頭。爲了讓事情更清晰,這將工作太(不建議,但演示行爲):

int *ptrHeapArray = new int[10]; 

for(int f=9; f>=0 ;f--) 
{ 
    *ptrHeapArray = f; 
    ptrHeapArray++; 
} 

ptrHeapArray -= 10; // reset the pointer to its original location 

for(int f=0; f<10; f++) 
    cout << ptrHeapArray[f] << "\n"; 
0

當你做ptrHeapArray ++它inscrements ptrHeapArray。當你打印出數據時,ptrHeapArray不再指向數組的開始。

0

問題是,在您的第一個示例中,ptrHeapArray最初設置爲數組的開頭。在遍歷循環時,您正在遞增指針,並且在for循環結束時指向數組中的最後一個元素。當您通過for循環顯示所有值時,您將索引到超過數組末尾的值,因爲ptrHeapArray指向您分配的數組中的最後一個元素。

重要的是要記住,您應該確保不要鬆開您使用new運算符返回的原始指針,以便您可以正確釋放堆中分配的內存。

1

您的ptrToHeapArrayPointer被錯誤命名,它只是一個標準的int ptr,您指向與ptrHeapArray相同的位置。如果你將它重命名爲currentPositionPtr,你的代碼可能對你更有意義。

0

在第一個循環中,您將指針ptrHeapArray加1,直到數組結束。所以在執行第一個for循環之後,你的指針指向數組的結尾,而不是在開始處。因此,當您試圖打印數組的內容時,您正在訪問無效的內存分配,並且這種行爲將是意外的。在第二種情況下,在將值分配給數組之前,您正在獲取起始地址的副本。因此,當您嘗試使用副本打印內容時,它將指向數組的開頭。