2014-12-19 203 views
1

指針存儲它指向的變量的地址。但爲什麼一個類型的指針不能指向另一個類型的變量的地址呢?指向不同類型的指針

例如,爲什麼下面的代碼給我一個錯誤?

int main() 
{ 
    int *i; 
    float a; 
    i=&a;  //this statement gives me an error 
} 
+3

問題標題中的答案**不是**? – WhozCraig 2014-12-19 08:45:48

+0

因爲'int *'與'float *'不一樣。如果你想要一個泛型指針使用'void *'(儘管我不推薦它)。 – 2014-12-19 08:45:53

+3

http://stackoverflow.com/questions/9802585/why-data-type-is-needed-in-pointer-declaration 這個問題解釋了爲什麼指針必須有一個類型。 – 2014-12-19 08:46:07

回答

-4

嗯,這其實是很可笑的,我寫的代碼,並得到了這樣那樣的錯誤,當時我想出的原因自己,但過後就忘,一旦我張貼的問題的答案只再次來到我身邊。

在上面的代碼i是被分配在另一方面浮子4個字節的存儲器(雖然取決於平臺,但現在讓剛剛假設)將被分配的8字節的存儲器整數類型的指針變量(再次假定)。因此,如果我讓i指向浮點型變量,它將失去精度,因爲它只能包含僅存儲在前兩個字節中的值。

+0

不要以內存塊的字節來思考。考慮編譯器在重新指向指針時應編譯的操作。 – harper 2014-12-19 08:50:17

+1

大小不重要,它是類型。即使它們具有相同的大小,您也不會在指向不同類型的指針之間進行隱式轉換。 – Mat 2014-12-19 08:54:51

+0

我甚至沒有看到在這裏回答OP的問題的嘗試... – 2014-12-19 08:55:28

0

您已聲明i爲整數,a爲浮點型。 如果你指向一個變量的數據類型應該是相同的,你可以指向a只有當a是一個整數變量。 將int的數據類型更改爲int並執行該程序。 你可以參考this的鏈接。 指針可以指向任何類型,如果它是一個空指針。 但無效的指針不能被解除引用。只有當編譯器知道指針變量的數據類型時,它才能取消引用指針並執行操作。

0

在32位機器中,通常地址爲四個字節。在聲明數據類型時,它指向該數據類型,並將該字節與數據類型字節相等。

在這種情況下,我是一個int指針。這意味着它將指向四個字節。值可以以整數格式存儲。而a是一個浮點變量。所以它將採用浮點格式存儲的值(它表示指數和尾數)。訪問具有不同數據類型的指針時。它將取消引用值對應的數據類型格式。所以我們得到了一些垃圾值或者一些在這些位中啓用的值。

相關問題