這個問題在這里已經有了答案: 您可以將不同型別的指標分配給彼此嗎? (2 個回答) 4天前關閉。
代碼片段1:
int main(){
float fl;
int *i=&fl;
}
錯誤是:
錯誤:無法在初始化 int *i=&fl; 中將 'float*' 轉換為 'int*'
代碼片段2:
int main(){
int i;
float *fl=&i;
}
錯誤是:
錯誤:在初始化浮點 *fl=&i; 中無法將 'int*' 轉換為 'float*'
問題
資料型別僅有助于將所需的記憶體大小分配給指定的資料型別。當涉及到記憶體地址時,無論變數的資料型別如何,兩個地址都將采用相同的格式。
例如-
int a;
float b;
cout<<&a<<" "<<&b;
輸出是_
0x61fe1c 0x61fe18
因此,通過查看地址,無法區分資料型別。那么當指標處理地址時,為什么不能給浮點變數賦值一個整數指標呢?
注意:這里我不是在談論資料型別的大小或每種資料型別占用的位元組數或存盤每條指令的資料格式。我只對變數的地址感興趣。
uj5u.com熱心網友回復:
當你取消參考一個指標時,它指向的資料型別必須是編譯器知道的,這樣它才能正確解釋它在那里找到的資料。這就是指標被“鍵入”的原因。
由于更改“型別”是一個先驗錯誤,因此除非使用顯式強制轉換,否則不允許這樣做。
uj5u.com熱心網友回復:
資料型別僅有助于將所需的記憶體大小分配給指定的資料型別。
這不是真的。指標的型別p
還告訴編譯器要為運算式使用什么型別*p
。
如果p
是 a int *
,則*p
具有型別int
,并且,如果程式使用諸如 a 的運算式*p 3
,編譯器將生成一個整數加法指令(或等效代碼)。如果p
是 a float *
,則*p
型別為float
,并且,如果程式使用諸如 的運算式*p 3
,編譯器將生成一個浮點加法指令(或等效代碼)。這些不同的指令將導致計算機以不同的方式處理這些位*p
。
當涉及到記憶體地址時,無論變數的資料型別如何,兩個地址都將采用相同的格式。
這在 C 實作中通常是正確的,但并不總是正確的。C 標準允許不同型別的指標具有不同的表示形式,但有一些例外。(指向字符型別和 to的指標void
必須彼此具有相同的表示。指向結構型別的指標必須彼此具有相同的表示。指向聯合型別的指標必須彼此具有相同的表示。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/470462.html