問題來源:在學習共享內存時,其中有一個指針類型的強制轉換
stu *p;
p=shmat();
其中stu是自定義結構,shmat()的返回類型是void*
指針佔據一個4個字節的地址空間(由於程序的尋址空間是2^32次方,即4GB,所以用4個字節表示指針就已經能指向任何程序能夠尋址到的空間了,所以指針的大小爲4字節)。我們可以將指針強制轉換成int型或者其他類型。同樣,我們也可以將任何一個常數轉換成int型再賦值給指針。所有的指針所佔的空間大小都是4字節,他們只是聲明的類型不同,他們的值都是地址指向某個東西,他們對於機器來說沒有本質差別,他們之間可以進行強制類型轉換。
指針 to 指針的強制類型轉換是指將指針所指的內容的類型由原先的類型轉換爲後面的類型:即進行變量解釋的時候,解釋的類型變化
void指針又名萬能指針,在現在的很多程序中,當參數不確定時就用萬能指針代替,這一類的指針在線程\進程函數裏特別常見。
1、指針類型強制轉換:
int m;
int *pm = &m;
char *cp = (char *)&m;
pm指向一個整型,cp指向整型數的第一個字節
2、結構體之間的強制轉換
struct str1 a;
struct str2 b;
a=(struct str1) b; //this is wrong
a=*((struct str1*)&b); //this is correct
但C++中感覺不安全,不支持指針類型的轉換了,
C++中對類型要求很高,不允許不同類型指針之間的相互賦值,void指針例外(任何類型指針都可以賦值給void指針) 如果要賦值必須顯示轉換
小心使用void指針:不能對void指針進行算法操作
解決1:
void *q;
stu* p;q=shmat(shmid,NULL,0);
if(q==(void*)-1) ERR_EXIT("shnat");
p=(stu *)q;
解決2: 賦值時就直接將stu*賦值給c=void*
stu* p;
p=(stu*)shmat(shmid,NULL,0);
if(p==(stu* )-1) ERR_EXIT("shnat");
所以對於這種還是不呀用了,通過了也很詭異
引進了4新的類型轉換操作符:
static_cast:最常用的類型轉換符,在正常狀況下的類型轉換,如把int轉換爲float
const_cast:用於取出const屬性,把const類型的指針變爲非const類型的指針
dynamic_cast:該操作符用於運行時檢查該轉換是否類型安全,但只在多態類型時合法,即該類至少具有一個虛擬方法。dynamic_cast與static_cast具有相同的基本語法,dynamic_cast主要用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
reinterpret_cast:interpret是解釋的意思,reinterpret即爲重新解釋,此標識符的意思即爲數據的二進制形式重新解釋,但是不改變其值。