2012-04-03 73 views
0

我正在研究一個使用指針算法的問題,我發現了這個小代碼的一小段代碼。我不明白它在做什麼。對我來說,它看起來像是將緩衝區的地址+ ix3的值分配給數組元素a [i]。但我不知道爲什麼這與我的程序有關。有人能告訴我這個循環中究竟發生了什麼嗎?基本指針算術,讓我難住

int *buffer=new int[5*3]; 

for (i=0;i<5;i++) 
    a[i] = buffer+i*3; 
+0

它以什麼方式「工作」?什麼是不尋常的? – cnicutar 2012-04-03 17:59:42

+0

您應該添加變量a的類型。它應該是指向一個整數的指針數組。這一點,這可能有助於瞭解更多的程序。如果a的類型不像整數指針數組,那麼可以顯示更多的代碼。 – harper 2012-04-03 18:03:08

+0

@harper a在變量列表中定義爲int ** a;並將在稍後的程序中用作2D陣列。 – adohertyd 2012-04-03 18:04:55

回答

2

表達

buffer+i*3 

是相同的

&buffer[i*3] 

所以你的假設是正確的,我希望a[]是一個指針數組。

注意,像buffer+k指針運算不採取包含在buffer地址的值,添加K它;相反,它等於&buffer[k]值,應該等於包含在緩衝區+ K的地址值*的sizeof (緩衝區指向的類型)。

+0

是a被定義爲int ** a;在我的變量列表中,稍後在程序中充當二維數組。我想將a的所有值寫入連續的內存塊(緩衝區)。這是我在我看到的解決方案中不能理解的唯一代碼行。我不是100%確定它是如何工作的,儘管 – adohertyd 2012-04-03 18:03:24

+0

「a」指向的值已經在連續的內存塊中,分配有「new」的那塊。 – Kleist 2012-04-03 18:14:51

+0

不,我的意思是我希望a的類型是一個指針數組,正如adohertyd所闡明的那樣。 – 2012-04-03 18:48:31

0

buffer+i*3;只是一個迂迴的做法&buffer[i*3];

2

它的確如你所說。數組a(其定義未顯示)可能具有int* [5]類型。

這樣做的目的是啓用正常的雙重索引(即不需要不斷地進行索引算術)。要看到這一點,請考慮如果您訪問a[1][2]會發生什麼情況。上述循環後,a[1]包含值buffer + 3,即它指向的buffer第四元件(添加n的指針移動的指針n元件向前)。因此,a[1][2](buffer+3)[2]相同,它訪問比buffer+3指向的位置更遠的兩個元素的值,換句話說,它等於buffer[5]

更一般地,在該初始化之後,a[i][k]訪問與buffer[3*i+k]相同的元素(當然,除非i大於4)。