void型別指標可以通過顯式轉換為具有更小或相同儲存對齊限制的指標,但資料可能失真。所謂「相同儲存對齊限制」是指void型別指標所指的資料在記憶體中所佔的長度與顯式轉換後的指標所指的資料在記憶體中所佔的長度相等,比如以上程式中的p1所指的原資料在記憶體中佔2個位元組,p2所指的資料在記憶體中也是佔兩個資料。但應注意的是,只有上面的這種轉換前後指標所指資料型別一致的轉換才保持資料不失真,如果型別不一致,即使具有相同儲存對齊限制,也有可能失真,比如由short轉向unsigned short,請看以下程式:
#include
int main(void)
其輸出結果就不再是-5了,因為在指標轉換時,short型別的資料也經過轉換變成了unsigned short型別的資料,具體的轉換過程請參考資料型別轉換。不過,也有數值不變的情況,如把a值變為5。
同理,如果是將void型別轉換為具有更小儲存對齊限制的指標時,也可能引起數值的改變。請看以下程式:
#include
int main(void)
綜上兩種情況,其實void型別指標所指向的資料一直都在記憶體中存放著,並沒有被改動,而只是我們在引用時從記憶體中提取資料的過程中發生了提取錯誤。道理很簡單,乙個有兩位元組組成的資料,而你非要提取一位元組,是有可能發生錯誤的(但不是一定會發生錯誤,當乙個資料既能用一位元組表示,又能用兩位元組表示時就不會產生錯誤)。如果我們提取正確的話,隨時都可以得到正確的資料,比如將上面的printf("%d\n",*p1);改為printf("%d\n",*(short *)p1);則又會輸出720。
3.如果將void型別的指標轉換為具有更大儲存對齊限制的指標時,則會產生無效值。如以下程式:
#include
int main(void)
其返回值為-859045865
void指標 void 的用法
指標有兩個屬性 指向變數 物件的位址和長度 但是指標只儲存位址,長度則取決於指標的型別 編譯器根據指標的型別從指標指向的位址向後定址 指標型別不同則定址範圍也不同,比如 int 從指定位址向後尋找4位元組作為變數的儲存單元 double 從指定位址向後尋找8位元組作為變數的儲存單元 1.void指標...
void指標 void 的用法
指標有兩個屬性 指向變數 物件的位址和長度 但是指標只儲存位址,長度則取決於指標的型別 編譯器根據指標的型別從指標指向的位址向後定址 指標型別不同則定址範圍也不同,比如 int 從指定位址向後尋找4位元組作為變數的儲存單元 double 從指定位址向後尋找8位元組作為變數的儲存單元 1.void指標...
void指標 void 的用法
指標有兩個屬性 指向變數 物件的位址和長度 但是指標只儲存位址,長度則取決於指標的型別 編譯器根據指標的型別從指標指向的位址向後定址 指標型別不同則定址範圍也不同,比如 int 從指定位址向後尋找4位元組作為變數的儲存單元 double 從指定位址向後尋找8位元組作為變數的儲存單元 1.void指標...