Const

const:限定一個變量不允許改變,產(chǎn)生靜態(tài)作用,const在一定程度上可以提高程序的安全性和可靠性戳晌。
const 推出的初始目的,正是為了取代預編譯指令痴柔,消除它的缺點躬厌,同時繼承它的優(yōu)點。宏定義:

#define xxxx \  
{\
    xxx\
}\

\后不能有任何字符竞帽,包括空格 最后的 “}\”需要最少空一行

struct xxxx  xxx = {.x1 = xxxxx,.x2 = xxxxx,.x3 = xxxxx};

在C99模式下可以使用該方式對結(jié)構(gòu)體進行初始化扛施,方便觀察每一個變量的初始值。

聲明為const的變量是不能被用戶改變的屹篓,因為編譯器會將該變量放在只讀區(qū)疙渣,比如在KEIL開發(fā)平臺下,聲明為const的變量放在FLASH區(qū)堆巧,這樣即使你使用取地址符 & 獲取聲明為 const 變量地址妄荔,并通過指針進行修改,雖然編譯器不報錯谍肤,但也是無法進行修改的啦租,因為進行FLASH編程是有條件的。


image.png

你會發(fā)現(xiàn)雖然P獲取了N的地址荒揣,但因為N存放在FLAH中篷角,所以通過指針也是無法改變N的值的。


image.png

可以看到N沒有改變系任。但是編譯器確實也沒報錯恳蹲。但是如果你直接 N = 4 的話,肯定是報錯的俩滥,因為你的N被申明為const嘉蕾。


image.png

《C語言深度剖析》中關于const的介紹發(fā)現(xiàn)和KEIL情況不一樣。

image.png

在KEIL中進行相關代碼的編寫霜旧,編譯错忱,最后可以看到如下結(jié)果:


image.png

這是仿真模式下兩個地址的內(nèi)容,一個存放在FLAH挂据,一個存放在RAM中以清,并且當修改FLAH的內(nèi)容之后(因為是軟件仿真模式,可以直接修改值)棱貌,復位重新運行玖媚,你會發(fā)現(xiàn)RAM的內(nèi)容對應改變了(重新運行后,進入main函數(shù)之前婚脱,有一段拷貝代碼今魔,就是函數(shù)外申明的一些變量的初始化過程)勺像,這就說明,在STM32错森、KEIL環(huán)境下吟宦,并不是《C語言深度剖析》中說的只有一份內(nèi)存,而是每一個都有一個涩维,申明為const情況跟使用宏定義的方式是一樣的殃姓。
以下是Watch中的內(nèi)容


image.png

但其實上面的結(jié)論是在使用 & 將N的地址獲取后的結(jié)果(從上圖可以看到p的值),實際上代碼中如果沒有獲取N的地址時瓦阐,情況又不一樣了蜗侈。
內(nèi)存情況:


image.png

在刪去獲取N地址后的內(nèi)存情況,可以發(fā)現(xiàn)N的值為0x2000470睡蟋,和FLAH地址0x08000000一樣踏幻。


image.png

這像一個地址。但通過Memory查看這個地址發(fā)現(xiàn)存放的不是5戳杀。


image.png

根據(jù)ARM內(nèi)核的知識可以知道该面,0x08000000地址存放的其實是棧頂指針,也就是說N存放的是棧頂指針嗎信卡?顯然不是隔缀。
然后對.map地址映射文件進行搜索,你會發(fā)現(xiàn)傍菇,根本沒有N的地址猾瘸。這樣說來,N在內(nèi)存的位置對用戶是不可見的桥嗤,而是由編譯器自動處理了须妻。
那么有沒有辦法找到這個拷貝源頭呢仔蝌。之前我說過泛领,先前能找到拷貝的源頭純屬偶然,有沒有什么方法可以找到呢敛惊?這其中的難點就是進入main函數(shù)之前的那段拷貝代碼不是我們用戶自己寫的渊鞋,而是C編譯器自動處理的,怎么辦瞧挤?
這個時候就需要請出一個關鍵人物:數(shù)據(jù)觀察點(關于數(shù)據(jù)觀察點锡宋,將有專門的一小節(jié)詳細說明)。
我們知道特恬,不管如何执俩,因為FLASH存放著變量初始值,然后在程序運行的時候才將FLASH中的值初始化到RAM中去癌刽,也就是我們使用的RAM變量役首,那么必然存在通過總線進行數(shù)據(jù)傳輸?shù)倪^程尝丐,所以可以通過數(shù)據(jù)觀察點的功能實現(xiàn)對地址的監(jiān)控,雖然我們不知道FLAH的地址衡奥,但是我們知道RAM的地址爹袁,所以只要對變量i進行監(jiān)控,就可以通過內(nèi)核的寄存器找到FLASH地址了矮固。如下:


image.png

這里的0x20000000就是i的RAM地址失息,最終可以找到FLASH的位置:


image.png

由此可以知道,F(xiàn)LAH中也是有多個相同副本存在的档址。
因此可以得出結(jié)論盹兢,在STM32、KEIL的環(huán)境下守伸,《C語言深度剖析》對于兩者的說法在這里不適用蛤迎。
看了那么多,沒有足夠的基礎是很難知道我在講什么的含友,下面用一張圖進行說明替裆,希望可以解答你的疑惑。

希望你在看完這張圖之后窘问,再回過頭看看前面的那些話辆童,對你應該會有幫助的。
-------------------------------------------------------------------------------2018/12/06 Osprey

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惠赫,一起剝皮案震驚了整個濱河市把鉴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儿咱,老刑警劉巖庭砍,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異混埠,居然都是意外死亡怠缸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門钳宪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揭北,“玉大人构拳,你說我怎么就攤上這事霞丧〖食ぃ” “怎么了侣灶?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵漾稀,是天一觀的道長谚中。 經(jīng)常有香客問我甸怕,道長博敬,這世上最難降的妖魔是什么缩多? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任呆奕,我火速辦了婚禮夯尽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘登馒。我一直安慰自己匙握,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布陈轿。 她就那樣靜靜地躺著圈纺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪麦射。 梳的紋絲不亂的頭發(fā)上蛾娶,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音潜秋,去河邊找鬼蛔琅。 笑死,一個胖子當著我的面吹牛峻呛,可吹牛的內(nèi)容都是我干的罗售。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钩述,長吁一口氣:“原來是場噩夢啊……” “哼寨躁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牙勘,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤职恳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后方面,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體放钦,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年恭金,在試婚紗的時候發(fā)現(xiàn)自己被綠了操禀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔚叨,死狀恐怖床蜘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔑水,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布扬蕊,位于F島的核電站搀别,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尾抑。R本人自食惡果不足惜歇父,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一蒂培、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榜苫,春花似錦护戳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驹饺,卻和暖如春钳枕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赏壹。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工鱼炒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝌借。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓昔瞧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硬爆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • (1)可以定義 const 常量 (2)const 可以修飾函數(shù)的參數(shù)擎鸠、返回值. 詳細內(nèi)容: 1缀磕、什么是const...
    幽鬼09閱讀 709評論 0 4
  • static 修飾局部變量 讓局部變量只初始化一次 局部變量在程序中只有一份內(nèi)存 并不會改變局部變量的作用域,僅僅...
    大沖哥閱讀 1,353評論 0 1
  • 改編自http://baike.sogou.com/v64494396.htm?fromTitle=CONSTht...
    mylocal閱讀 474評論 0 1
  • 作為B站的一名老用戶(雖然也就差不多四年)劣光,從最開始的彈幕視頻分享網(wǎng)站袜蚕,到現(xiàn)在活躍用戶超過一億,每天視頻播放量超過...
    筷子君閱讀 17,774評論 1 20
  • 讀俞敏洪的徐霞客精神說到:我每年從旅游記錄,讀書記錄雄可,到日常生活記錄凿傅,包括寫日記,大概至少會寫二十萬到三十萬字数苫。這...
    毛老師工作室閱讀 168評論 0 0