指針存儲它指向的變量的地址。但爲什麼一個類型的指針不能指向另一個類型的變量的地址呢?指向不同類型的指針
例如,爲什麼下面的代碼給我一個錯誤?
int main()
{
int *i;
float a;
i=&a; //this statement gives me an error
}
指針存儲它指向的變量的地址。但爲什麼一個類型的指針不能指向另一個類型的變量的地址呢?指向不同類型的指針
例如,爲什麼下面的代碼給我一個錯誤?
int main()
{
int *i;
float a;
i=&a; //this statement gives me an error
}
嗯,這其實是很可笑的,我寫的代碼,並得到了這樣那樣的錯誤,當時我想出的原因自己,但過後就忘,一旦我張貼的問題的答案只再次來到我身邊。
在上面的代碼i
是被分配在另一方面浮子4個字節的存儲器(雖然取決於平臺,但現在讓剛剛假設)將被分配的8字節的存儲器整數類型的指針變量(再次假定)。因此,如果我讓i
指向浮點型變量,它將失去精度,因爲它只能包含僅存儲在前兩個字節中的值。
您已聲明i
爲整數,a
爲浮點型。 如果你指向一個變量的數據類型應該是相同的,你可以指向a只有當a是一個整數變量。 將int的數據類型更改爲int並執行該程序。 你可以參考this的鏈接。 指針可以指向任何類型,如果它是一個空指針。 但無效的指針不能被解除引用。只有當編譯器知道指針變量的數據類型時,它才能取消引用指針並執行操作。
在32位機器中,通常地址爲四個字節。在聲明數據類型時,它指向該數據類型,並將該字節與數據類型字節相等。
在這種情況下,我是一個int指針。這意味着它將指向四個字節。值可以以整數格式存儲。而a是一個浮點變量。所以它將採用浮點格式存儲的值(它表示指數和尾數)。訪問具有不同數據類型的指針時。它將取消引用值對應的數據類型格式。所以我們得到了一些垃圾值或者一些在這些位中啓用的值。
問題標題中的答案**不是**? – WhozCraig 2014-12-19 08:45:48
因爲'int *'與'float *'不一樣。如果你想要一個泛型指針使用'void *'(儘管我不推薦它)。 – 2014-12-19 08:45:53
http://stackoverflow.com/questions/9802585/why-data-type-is-needed-in-pointer-declaration 這個問題解釋了爲什麼指針必須有一個類型。 – 2014-12-19 08:46:07