2011-02-02 209 views
7

嘗試了下面的代碼來檢查將整數指針轉換爲整數時會發生什麼。將整數指針轉換爲整數

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
     int *p; 
     int a; 
     p = (int *)malloc(sizeof(int)); 
     *p = 10; 
     a = (int)p; 
     printf("%d\n",*p); 
     printf("%d \n",a); 
     return 0; 
} 

The output is : 10 
       135680008 

任何人都可以解釋,與此轉換相關的概念?提供的任何與此主題相關的鏈接也會有所幫助。

+1

我真的不知道這裏的問題是什麼。顯然,如果你編寫了這個代碼,你應該瞭解它是如何工作的,以及你得到的輸出是否如預期的那樣。 – 2011-02-02 09:55:49

回答

11

顯然你把指針與指針的內容混淆了。

作爲與現實世界的類比,你可以說,我指着一隻鳥,你想把我的食指轉換成一隻鳥。但是類型'鳥'和'手指'之間沒有關係。

將該類比轉移到您的程序中:您將指向int的對象轉換爲int本身。由於C指針被實現爲「存儲單元的數量」,並且由於存在可用的存儲單元,所以很明顯(int)p將導致非常大的數量。

鑄造是一件討厭的事情。指針與整數非常類似是一個巧合。如果它們被實現爲「內存銀行」的地址,那麼你不會問這個問題,因爲這不會有明顯的關係,而且你也不可能做這個演員。

4

135680008是指向p指向的十進制地址(十六進制爲0x8165008):分配給內存區的地址爲malloc

1

在這裏,您打印出的內存地址爲a,但您將其打印爲帶符號的十進制整數。它與格式沒有太大關係,因爲一些高內存地址,確切的邊界取決於您的字大小和編譯器,將被打印爲負數。

標準是將其打印爲無符號十六進制填充0到8或16個字符(實際上,這取決於確切的字大小了)。在printf,這將是%#08X,所以內存地址0x243將被打印爲0x00000243。