2011-10-06 83 views

回答

1

當然!

p + n 

其中p是一個指針和n是整數總是明確的。它產生的地址是「元素類型p的大小的n倍指向」來自p本身的字節。在這種情況下,p2是指向指針的指針。所以p2 + 4是地址「4 *指針大小」字節,通過p2

由於您在您的具體示例中指向局部變量,因此會很奇怪。但這不會是非法的。

2

對方回答是完全錯誤的:

int *p = &a; 

聲明一個單個指針變量(未指針的數組)。這相當於,WRT索引,與單一元素的數組:

int *(array[1]) = { &a }; 

所以你可以做(&array[0]) + 1array + 1,或p + 1,因爲形成的一過去的最端指針被允許:一維過去末端指針指向數組結尾後的一個虛構元素。一個過去的指針是而不是可解引用,因爲它指向沒有真正的對象。

但是你不能計算任何其他指針值

特別是,p+2不是有效。

+0

不確定你完全錯誤的意思。另一個答案從來沒有聲稱p被定義爲一個指針數組。事實上,「陣列」一詞從未出現過。無論如何,'p + n'的語義對於指針'p'和整數'n'是很好的定義的。確定操作可能會出現段錯誤,但這與問題無關。再次,這個問題和其他答案從來沒有提及過數組。 –

+0

「_事實上,」數組「這個詞從未出現過。」這就是它錯誤的原因:如果沒有數組,則沒有「定義明確的」指針運算。 **指針算術是在數組上定義的。** – curiousguy

+0

我的猜測是我們不同意明確定義的含義。 [C參考手冊](http://cm.bell-labs.com/who/dmr/cman.pdf)在第6.4節「可以添加整數和指針」以及第7.4.1節解釋發生了什麼。 C參考手冊也沒有提到數組。它只是說你得到計算出的地址中的任何內存數據。對我而言,該手冊指定了一個**定義明確的**操作,而沒有提到字數組。所以我們的不同意見是基於我們正在以不同方式解釋的明確定義的術語。乾杯。 :) –