2009-04-17 86 views
12

考慮下面的代碼片斷:指針運算在C

int (*p)[3]; 
int (*q)[3]; 

q = p; 
q++; 
printf("%d, %d\n", q, p); 
printf("%d\n", q-p); 

我知道指針運算是智能的,這意味着操作q++進步超前q足夠的字節,以指向下一個3-整數陣列,所以它並不讓我驚訝的是,第一印刷是「12, 0」,這意味着遞增q使它在12

更大但第二打印確實我驚奇。它打印1!
那麼爲什麼要打印1而不是12呢?它只是讓我困惑。

回答

27

++增量運算符一樣,帶指針的-減法運算符也會考慮指向的對象的大小。具體來說,返回的結果是指針值除以指向對象的大小(在本例中爲12)中的字節數差異。所以,不同的是12個字節,由大小12或1

+0

所以沒有辦法採取兩個指針,並獲得他們的差異字節? – 2009-04-17 09:14:21

+8

將指針轉換爲(char *),然後您將得到字節差異。 – 2009-04-17 09:15:59

4

如果你真的想知道投三分球各一個(字符*)的差異,然後(INT),然後減去。這應該給你答案。

此代碼爲您提供了絕對值:

printf("%d\n", abs((int)((char*)q) - (int)((char*)p))); 

請記住,包括math.h中

編輯: 正如評論指出,我們並不需要一個雙投。將每個指針投射到一個int然後減去給出與上面(不需要的)雙重鑄造相同的答案。

printf("%d\n", abs((int)(q) - (int)(p)));