這兩個陳述句的意思是否與p指向地址位置 10 的意思相同?在編譯時,第一次初始化會給出一些警告。那是什么意思?
#include <stdio.h>
int main()
{
int *p = 10;
int *q = (int *)10;
return 0;
}
輸出:
warning: initialization of ‘int *’ from ‘int’ makes pointer from integer without a cast [- Wint-conversion]
uj5u.com熱心網友回復:
這兩種情況都將整數 10 轉換為用于初始化int *. 第二種情況下的演員表明確表明這種行為是故意的。
雖然允許從整數轉換為指標,但賦值運算子(以及擴展,初始化)不允許這種轉換,因此需要遵守強制轉換。然而,許多編譯器仍然允許這樣做,并且只是發出警告(正如您顯然所做的那樣)。
但是請注意,除非您在支持讀取或寫入特定記憶體地址的嵌入式系統上,否則實際嘗試使用分配了特定數值的指標很可能會導致崩潰。
uj5u.com熱心網友回復:
int *p = 10;不正確(違反約束),編譯器必須生成診斷訊息。編譯器可能會拒絕該程式,如果不這樣做,則不會定義任何行為。規則是指標的初始值設定項必須是兼容的指標值或空指標常量。
int *q = (int *)10;表示將整數轉換10為指標。結果是實作定義的,它可能是一個陷阱表示,這意味著如果執行到達這一行,初始化會導致未定義的行為。
uj5u.com熱心網友回復:
int和指向整數的指標int*是不同的型別。在10第一行是int您想分配給指標的int型別。因此警告。(在 X86 上兩者共享相同的大小,但在這一點上主要是巧合)。
通過將 int 轉換為指標,就像你在第二行所做的那樣,你告訴編譯器“嘿,我知道這些是不同的型別,但我知道我在做什么,所以繼續把值 10 當作一個指標,因為我確實想指向地址為 10" 的記憶體。(幾乎在所有情況下,您都無法使用 10 的記憶體地址)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361007.html
下一篇:取消參考指向串列的雙指標
