2011-04-10 203 views
3
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

+0

'的ptr = &b[0];'是多餘的;你可以使用'ptr = buf'來代替。 – dawg 2011-04-12 04:22:13

回答

6

發生了什麼事是這樣的:

  1. b[0]因爲你deferencing ptr分配的66一個值,即你正在做*ptr,然後進行分配

  2. 指針本身被遞增,即&b[0]++,成爲&b[1]

  3. ptr現在指向b[1],這是7

換一種方式:在兩個完全不同的事情進行的增量和分配。並且由於它是後綴增量,所以在其原始地址接收新值之後,指針增加

+0

我明白* ptr ++位的代碼是做什麼的,但爲什麼我可以將該表達式分配給一個數字? – Sam 2011-04-10 06:25:29

+0

@Sam:你解除引用'ptr'並將66賦值給它所對應的值,但是你正在增加指針本身。 – BoltClock 2011-04-10 06:27:02

+0

謝謝,我現在明白了。 :) – Sam 2011-04-10 06:28:38

2

您正在增加指針。之後它指向b [1]。 B [0]的值大概是66

+0

是的,我明白,但爲什麼編譯器讓我分配* ptr ++到一個數字,即使它沒有效果? – Sam 2011-04-10 06:23:43

+0

檢查b [0] – slezica 2011-04-10 06:24:10

+0

5的值?但編譯器不會讓我輸入5 ++ = 7; – Sam 2011-04-10 06:26:04

1

ptr++被稱爲後遞增,這意味着你第一使用的ptr舊值(覆蓋5),然後增加ptr

+0

謝謝!所以等價的代碼基本上是* ptr = 66; * PTR ++ ;?這對我有意義。 – Sam 2011-04-10 06:27:20

+0

其實這是沒有道理的,那麼* ptr就是67. – Sam 2011-04-10 06:27:46

+0

它相當於'* ptr = 66; PTR ++'。這意味着你增加了*指針*,而不是它指向的內容。 – Lindydancer 2011-04-10 06:35:01