int arr[5];
arr++;
arr+4; //compile with only this
printf("%u", arr);
爲什麼C語言編譯器不能與arr++
說:「需要左值」,但也 成功地與arr+4
編譯編譯? arr++
表示法的左值概念是什麼?解讀左值和右值與符號ARR + 4和改編++
int arr[5];
arr++;
arr+4; //compile with only this
printf("%u", arr);
爲什麼C語言編譯器不能與arr++
說:「需要左值」,但也 成功地與arr+4
編譯編譯? arr++
表示法的左值概念是什麼?解讀左值和右值與符號ARR + 4和改編++
當您使用arr
時,它當然可以將衰減指向其第一個元素,即它相當於&arr[0]
。
當你做arr++
你試圖修改這個指針(有效地做arr = arr + 1
)。這是不可能的,因爲數組的位置是固定的並且不能被修改。
With arr + 4
你在做指針算術。在這裏,您將4
添加到腐爛的指針,但您不嘗試修改指針本身。事實上,這相當於&arr[4]
。
您顯示的代碼還有一個小問題。我說小但我的意思是大。
隨着
printf("%u", arr);
你讓數組衰變爲指針。然後嘗試使用"%u"
格式說明符打印此指針。 但格式說明符是打印int
,而不是指針。不匹配的格式說明符和參數類型導致未定義的行爲。
要品脫您需要使用"%p"
格式的通用(void *
)指針,投指針void *
:
printf("%p", (void *) arr);
實際上'arr + 4;'什麼都不做。是句法正確的,但它是一個沒有效果的語句,只會被忽略 –
謝謝。我明白了。很好的解釋。 –
'arr'最終是不是左值(因爲它衰變的結果),並且您只能在左值上使用修改增量運算符。加法沒有這樣的限制(例如,說'1 + 1'是有效的)。 –
發佈其他人可以編譯和測試的整個程序。 – Hannebambel
[是數組名稱的指針嗎?](https://stackoverflow.com/questions/1641957/is-an-array-name-a-pointer) –