2012-07-31 201 views
0

我有一個程序問題,這裏是代碼。C指針問題

int main() 
{ 
int *p,*q; 
p=(int*)1000; 
printf("%d ",p); 
q=(int*)2000; 
printf("%d",q); 
printf("%d",(p-q)); 
return 0; 
} 

但答案即將爲

1000 
2000 
-250 

我無法理解有什麼p-q發生以及爲什麼答案之際,-250

+2

請注意,使用'%d'格式說明符打印指針會調用未定義的行爲。你可以使用'%p'格式說明符printf(「%p」,(void *)p);'打印'void *',或者你可以在打印之前將指針轉換爲整型,'printf(「 %「PRIdPTR」「,(intptr_t)p);'。對於指針差別,'printf(「%td」,(p-q));'。 – 2012-07-31 20:26:48

回答

12

正確但可能無用的答案:p - q等於(1000 - 2000)/(sizeof int)。對於大多數C編譯,sizeof int是4.

潛在更有用的答案:像(int*) 1000這樣的類型轉換的影響是未定義的。該代碼創建一個指向地址爲1000的int 的指針。該地址可能無效。要創建一個指向與價值1000一個整數,這樣寫:

int i = 1000; 
int *p = &i; 

現在pi,並*p,該值通過p指出,爲1000

下面是一些正確的代碼,可以說你的意思:

int main() { 
    int i = 1000; 
    int j = 2000; 

    int *p = &i; 
    int *q = &j; 

    printf("i = %d *p = %d\n", i, *p); 
    printf("j = %d *q = %d\n", j, *q); 
    printf("*p - *q = %d\n", *p - *q); 
} 
0

在這個程序中有很多未定義的行爲,打印的值實際上非常不重要。

+0

真的嗎?我不這麼認爲。 – 2012-07-31 16:33:53

+7

-1:是的,但完全沒有幫助。 – 2012-07-31 16:37:40

+0

它是怎麼7人upvoted -1評論,但答案仍然有+1? – Celeritas 2013-08-02 06:11:18

6

當你減去兩個指針,只要它們指向同一數組,結果是元素的分隔它們的數量。

在您的平臺上,int是4個字節。在地址2000和地址1000之間有-250個元素。

由於p和q不都指向同一個數組,所以結果是未定義的。你可以得到任何結果,包括你期望的結果。

0

p是一個指針變量,它只能存儲一個int變量的地址。但是您將1000存儲爲無效的地址。然後您將2000存儲到變量q

現在你正在做指針算術p-q。總是指針算術會根據地址類型的大小給出輸出。這將像(p - q)/sizeof(type)一樣工作。

考慮一下,如果pqchar *變量,然後p-q意志給你輸出-1000

在你的情況pqint *變量,然後p-q意志給你輸出250如果int大小4字節。在編譯器上執行此操作,其中int的大小爲2個字節,則會得到一個結果爲-500