找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2286|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

關(guān)于一個C語言結(jié)構(gòu)指針的臆想

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82781 發(fā)表于 2015-6-13 17:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


我為這個問題糾結(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é)果是什么但我從未放棄!









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表