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