我正在研究一個使用指針算法的問題,我發現了這個小代碼的一小段代碼。我不明白它在做什麼。對我來說,它看起來像是將緩衝區的地址+ ix3的值分配給數組元素a [i]。但我不知道爲什麼這與我的程序有關。有人能告訴我這個循環中究竟發生了什麼嗎?基本指針算術,讓我難住
int *buffer=new int[5*3];
for (i=0;i<5;i++)
a[i] = buffer+i*3;
我正在研究一個使用指針算法的問題,我發現了這個小代碼的一小段代碼。我不明白它在做什麼。對我來說,它看起來像是將緩衝區的地址+ ix3的值分配給數組元素a [i]。但我不知道爲什麼這與我的程序有關。有人能告訴我這個循環中究竟發生了什麼嗎?基本指針算術,讓我難住
int *buffer=new int[5*3];
for (i=0;i<5;i++)
a[i] = buffer+i*3;
表達
buffer+i*3
是相同的
&buffer[i*3]
所以你的假設是正確的,我希望a[]
是一個指針數組。
注意,像buffer+k
指針運算不不採取包含在buffer
地址的值,添加K它;相反,它等於&buffer[k]
值,應該等於包含在緩衝區+ K的地址值*的sizeof (緩衝區指向的類型)。
buffer+i*3;
只是一個迂迴的做法&buffer[i*3];
。
它的確如你所說。數組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)。
它以什麼方式「工作」?什麼是不尋常的? – cnicutar 2012-04-03 17:59:42
您應該添加變量a的類型。它應該是指向一個整數的指針數組。這一點,這可能有助於瞭解更多的程序。如果a的類型不像整數指針數組,那麼可以顯示更多的代碼。 – harper 2012-04-03 18:03:08
@harper a在變量列表中定義爲int ** a;並將在稍後的程序中用作2D陣列。 – adohertyd 2012-04-03 18:04:55