2011-05-11 132 views
1

我有這樣的代碼在C:打印指針

int tab[10] = {3, 10, 5, 7, 9, 4, 9, 4, 6, 8, 0}; 
printf("(int*)&tab[0]=%p (int*)&tab[1]=%p (int*)&tab[1]-(int*)&tab[0]=%d\n", (int*)&tab[0], (int*)&tab[1], ((int*)&tab[1]) - ((int*)&tab[0])); 

,並返回:

(int*)&tab[0]=0xbf9775c0 (int*)&tab[1]=0xbf9775c4 (int*)&tab[1]-(int*)&tab[0]=1 

我不明白的是,爲什麼差別最後返回的是1而不是4。任何人都可以告訴我一種方式來打印他們(地址和他們的差異)以一致的方式(int *)?

回答

2

因爲你在做指針算術。並且指針算術總是以指針指向的任何單位完成(在這種情況下,指針爲4,因爲系統上的指針爲sizeof(int) == 4)。

如果您想知道原始地址的差異,則可以將減法結果乘以sizeof(int),或者在進行減法之前將指針指向char *

+1

或者只是在減去之前將它們轉換爲int。 – Lundin 2011-05-11 16:20:23

+0

@Lundin:假設'sizeof(size_t) 2011-05-11 16:21:02

+3

@Oli - 我認爲你的意思是'intptr_t',而不是'size_t',在你的評論中。 – 2011-05-11 16:27:41

0

由於

((int *) &tab[1]) - ((int *) &tab[0]) 
=> &tab[1] - &tab[0] 
=> (tab + 1) - tab 
=> 1 

在另一方面

((intptr_t) &tab[1]) - ((intptr_t) &tab[0]) 
=> ((intptr_t) (tab + 1)) - ((intptr_t) tab) 
=> sizeof (int) 

其中使用intptr_t在stdint.h定義(從C99標準庫)。