我有一個程序問題,這裏是代碼。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
?
我有一個程序問題,這裏是代碼。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
?
正確但可能無用的答案:p - q
等於(1000 - 2000)/(sizeof int)
。對於大多數C編譯,sizeof int
是4.
潛在更有用的答案:像(int*) 1000
這樣的類型轉換的影響是未定義的。該代碼創建一個指向地址爲1000的int 的指針。該地址可能無效。要創建一個指向與價值1000一個整數,這樣寫:
int i = 1000;
int *p = &i;
現在p
點i
,並*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);
}
在這個程序中有很多未定義的行爲,打印的值實際上非常不重要。
真的嗎?我不這麼認爲。 – 2012-07-31 16:33:53
-1:是的,但完全沒有幫助。 – 2012-07-31 16:37:40
它是怎麼7人upvoted -1評論,但答案仍然有+1? – Celeritas 2013-08-02 06:11:18
當你減去兩個指針,只要它們指向同一數組,結果是元素的分隔它們的數量。
在您的平臺上,int是4個字節。在地址2000和地址1000之間有-250個元素。
由於p和q不都指向同一個數組,所以結果是未定義的。你可以得到任何結果,包括你期望的結果。
p
是一個指針變量,它只能存儲一個int
變量的地址。但是您將1000
存儲爲無效的地址。然後您將2000
存儲到變量q
。
現在你正在做指針算術p-q
。總是指針算術會根據地址類型的大小給出輸出。這將像(p - q)/sizeof(type)
一樣工作。
考慮一下,如果p
和q
是char *
變量,然後p-q
意志給你輸出-1000
在你的情況p
和q
是int *
變量,然後p-q
意志給你輸出250
如果int
大小4字節。在編譯器上執行此操作,其中int
的大小爲2個字節,則會得到一個結果爲-500
。
請注意,使用'%d'格式說明符打印指針會調用未定義的行爲。你可以使用'%p'格式說明符printf(「%p」,(void *)p);'打印'void *',或者你可以在打印之前將指針轉換爲整型,'printf(「 %「PRIdPTR」「,(intptr_t)p);'。對於指針差別,'printf(「%td」,(p-q));'。 – 2012-07-31 20:26:48