|
昨天給朋友講了 3個問題,
A〉什么是函數指針,本質是?指針的本質?
B〉什么是類型,類型的本質是?
C〉什么是強制類型轉換,本質是?作者 張世光 億通科技軟件部 060913 QQ:87895224 MSN:Z_55@hotmail.com
A〉什么是函數指針,本質是?指針的本質?
如
voidfun(); //函數聲明
void(*ptrfun)();//函數指針變量ptrfun 的聲明,表明ptrfun這個指針指向一個 voidfun()函數類型的函數地址。
〉函數的名字 代表函數的地址;
所以,可以這樣
ptrfun =fun ;//給ptrfun賦值。此時,ptrfun 就是 fun函數的別名;
在需要調用 fun()的地方,可以這樣寫
(*ptrfun)(); //等同于 fun();//這就是別名的意義。
指針的本質是一個固定長度(32位系統上是4個byte)的空間中放置的內容是一個內存地址。
而指針類型的本質就是對這個地址的解釋方式。不同的指針類型,對即使相同的內存地址的解釋是不同的,受影響的空間大小也不同。受影響的空間的大小等于sizeof(類型)。
如 short i=0x1234;
short * psort = &i;
char *pchar = &i; //此時pshort ==pchar;即指向了同一個地址;
那么 (*pshort) 和 (*pchar)的值各是什么?
假設 sizeof(short)==2
sizeof(char)==1
假如內存中這樣:
---地址 0x1000--
| 0x34 |
----------------
| 0x12 |
----------------
那么,psort==0x1000 ,同時,pchar==0x1000 ;
那么,(*psort) 代表是 地址0x1000 和 0x1001這兩個字節的內容; <-----由其類型決定
(*pchar)代表 地址0x1000這一個字節的內容; <<-----由其類型決定
B〉什么是類型,類型的本質是?
類型是我們為了方便有效利用內存來表達我們的意思而作的語言上的區分,看上面的解釋就可以了解為何有類型區分。這里我想講另一個類型相關問題。
有人問 TypeDef void (*PtrFun)();
和 void (*ptrfun)(); 有什么區別?
看使用方式,
PtrFun pfun;
void fun();
pfun = ptrfun = fun;
由上面可以看出 PtrFun是類型,而ptrfun是一個變量 。
使用方式自然也有差別,PtrFun 用來定義函數指針變量。而ptrfun已經是一個函數指針變量,可以直接賦值使用。
(*pfun)();
(*ptrfun)(); //
C〉什么是強制類型轉換,本質是?
強制類型轉換 的本質是程序員告訴編譯器“你不用擔心,這里的類型變化是正確的”。
|
|