|
我為這個問題糾結(jié),那就是C中的結(jié)構(gòu)指針,書中常見的形制大致是這樣的:
struct
{
uint32_t a;
uint16_t b;
uint8_t c;
}*numb;
然后再程序中引用這個結(jié)構(gòu)指針就是numb->a和numb->b沒什么問題,悲劇的是在庫文件中發(fā)現(xiàn)一種我不能解釋的形制如下:
#define numb (numb_typ*)地址這種新式,numb_typ是一個類似結(jié)構(gòu)宏的定義,問了好多人,只言片語,不解其故,怎么解釋呢?我翻來覆去的想這個問題,終于在今早上洗臉的時候突然想到這問題可能是這樣的:
首先:不要管這個宏把它拆解,就是(numb_typ*)地址這種形式那么這個numb_typ是數(shù)據(jù)類型因為沒記錯的的話結(jié)構(gòu)和枚舉都是數(shù)據(jù)類型,有在外面加了括號-----“強(qiáng)制類型轉(zhuǎn)換”但是他轉(zhuǎn)換誰呢?轉(zhuǎn)換地址嗎?顯然不是,他肯定不是轉(zhuǎn)換地址,地址他也不需要轉(zhuǎn)換,那他轉(zhuǎn)換誰呢?這時候看看他的后面緊跟“*”,似乎預(yù)示著什么?是不是可以理解為他強(qiáng)制轉(zhuǎn)換了一個結(jié)構(gòu)指針?但是變量跑哪里去了?沒有變量的指針傷不起啊,從結(jié)果看是肯定定義的,因為結(jié)果中就是用結(jié)構(gòu)指針的形式訪問的。
其次:另一方面講他有不符合常理,不按套路出牌,他沒有用賦值的辦法來把地址寫入而是直接類似定義一個結(jié)構(gòu)指針變量,但是只有把它理解成它定義了一個結(jié)構(gòu)指針變量才符合常理,就變成這種
(numb_typ)*p;
p=(numb_typ*)地址;//立即數(shù)轉(zhuǎn)換為地址
這樣P就是一個結(jié)構(gòu)指針,他就指向以這個地址開頭的連續(xù)數(shù)據(jù)區(qū)域。所以:
(numb_typ*)地址<=>(numb_typ)*p;p=地址;兩者等價,前者的形制更簡便速度更快,效率更高,只有他等價才可以解釋為什么可以用結(jié)構(gòu)指針來訪問,想必就是“*”帶來的困惑,哎!
總之:以上所述均是不可靠的,有帶進(jìn)一步請教高人,暫且這樣理解吧,這種寫法是合法的,C語言啊C語言靈活是你的優(yōu)點也是你的缺點,你太靈活大了!這也映射了人生,加油吧,不管結(jié)果是什么但我從未放棄!
|
|