int b[2], *ptr;
b[0] = 5;
b[1] = 7;
ptr = &b[0];
*ptr++ = 66;
printf("%d", *ptr);
爲什麼我被允許做*ptr++ = 66
一行,即使= 66
位似乎什麼都不做?當我打印*ptr
它是7.任何人都可以解釋爲什麼?編譯器不應該抱怨= 66
位沒有效果嗎?C - 爲什麼我允許這樣做?
是不是*ptr++ = 66
基本上相當於7 = 66
?
int b[2], *ptr;
b[0] = 5;
b[1] = 7;
ptr = &b[0];
*ptr++ = 66;
printf("%d", *ptr);
爲什麼我被允許做*ptr++ = 66
一行,即使= 66
位似乎什麼都不做?當我打印*ptr
它是7.任何人都可以解釋爲什麼?編譯器不應該抱怨= 66
位沒有效果嗎?C - 爲什麼我允許這樣做?
是不是*ptr++ = 66
基本上相當於7 = 66
?
發生了什麼事是這樣的:
b[0]
因爲你deferencing ptr
分配的66
一個值,即你正在做*ptr
,然後進行分配
指針本身被遞增,即&b[0]++
,成爲&b[1]
ptr
現在指向b[1]
,這是7
換一種方式:在兩個完全不同的事情進行的增量和分配。並且由於它是後綴增量,所以在其原始地址接收新值之後,指針增加。
的ptr++
被稱爲後遞增,這意味着你第一使用的ptr
舊值(覆蓋5
),然後增加ptr
。
謝謝!所以等價的代碼基本上是* ptr = 66; * PTR ++ ;?這對我有意義。 – Sam 2011-04-10 06:27:20
其實這是沒有道理的,那麼* ptr就是67. – Sam 2011-04-10 06:27:46
它相當於'* ptr = 66; PTR ++'。這意味着你增加了*指針*,而不是它指向的內容。 – Lindydancer 2011-04-10 06:35:01
您增加指針。如果你想增加指針的值,使用(*ptr)++
。
'的ptr = &b[0];'是多餘的;你可以使用'ptr = buf'來代替。 – dawg 2011-04-12 04:22:13