姓名:王重月? 學(xué)號(hào):21021211019? ?學(xué)院:電子工程學(xué)院
轉(zhuǎn)自:(30條消息) 嵌入式面經(jīng)_Oliver.H的博客-CSDN博客_嵌入式面經(jīng)
【嵌牛導(dǎo)讀】volatile、引用指針、static等知識(shí)。
【嵌牛鼻子】volatile,引用、指針
【嵌牛提問】volatile有什么含義?引用和指針有什么區(qū)別?
【嵌牛正文】volatile原理:
Volatile意思是“易變的”,應(yīng)該解釋為“直接存取原始內(nèi)存地址”比較合適。 “易變”是因?yàn)橥庠谝蛩匾鸬?,像多線程,中斷等;
C語言書籍這樣定義volatile關(guān)鍵字:volatile提醒編譯器它后面所定義的變量隨時(shí)都有可能改變,因此編譯后的程序每次需要存儲(chǔ)或讀取這個(gè)變量的時(shí)候,告訴編譯器對(duì)該變量不做優(yōu)化,都會(huì)直接從變量內(nèi)存地址中讀取數(shù)據(jù),從而可以提供對(duì)特殊地址的穩(wěn)定訪問。。如果沒有volatile關(guān)鍵字,則編譯器可能優(yōu)化讀取和存儲(chǔ),可能暫時(shí)使用寄存器中的值,如果這個(gè)變量由別的程序更新了的話,將出現(xiàn)不一致的現(xiàn)象。(簡潔的說就是:volatile關(guān)鍵詞影響編譯器編譯的結(jié)果,用volatile聲明的變量表示該變量隨時(shí)可能發(fā)生變化,與該變量有關(guān)的運(yùn)算,不要進(jìn)行編譯優(yōu)化,以免出錯(cuò))
下面是volatile變量的幾個(gè)例子:
1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
2). 一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables)
3). 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量
回答不出這個(gè)問題的人是不會(huì)被雇傭的。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會(huì)帶來災(zāi)難。
幾個(gè)問題:
1)一個(gè)參數(shù)既可以是const還可以是volatile嗎?
可以的,例如只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。
2) 一個(gè)指針可以是volatile 嗎?
可以,當(dāng)一個(gè)中服務(wù)子程序修改一個(gè)指向buffer的指針時(shí)。
3). 下面的函數(shù)有什么錯(cuò)誤:

這段代碼的目的是用來返指針ptr指向值的平方,但是,由于ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:

由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下

注意:頻繁地使用volatile很可能會(huì)增加代碼尺寸和降低性能,因此要合理的使用volatile。
引用和指針有什么區(qū)別
1)引用必須被初始化,指針不必。
2)引用初始化以后不能被改變,指針可以改變所指的對(duì)象。
3)不存在指向空值的引用,但是存在指向空值的指針。
.h頭文件中的ifndef/define/endif 的作用?
防止該頭文件被重復(fù)引用。
全局變量和局部變量的區(qū)別?
1.全局變量儲(chǔ)存在靜態(tài)數(shù)據(jù)區(qū),局部變量在堆棧中。
2.全局變量的生命周期是整個(gè)函數(shù)區(qū)間,局部變量的生命周期是聲明該變量的函數(shù)區(qū)間。
全局變量和靜態(tài)全局變量的區(qū)別?
1.全局變量和靜態(tài)全局變量都存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū)
2.全局變量的作用域是整個(gè)函數(shù),靜態(tài)全局變量的作用域是**聲明該變量的模塊*
3.static全局變量只初使化一次*
static函數(shù)與普通函數(shù)?
static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝
問:A.c 和B.c兩個(gè)c文件中使用了兩個(gè)相同名字的static變量,編譯的時(shí)候會(huì)不會(huì)有問題?這兩個(gè)static變量會(huì)保存到哪里(棧還是堆或者其他的)?
答:static的全局變量,表明這個(gè)變量僅在本模塊中有意義,不會(huì)影響其他模塊。
他們都放在數(shù)據(jù)區(qū),但是編譯器對(duì)他們的命名是不同的。
如果要使變量在其他模塊也有意義的話,需要使用extern關(guān)鍵字。
不能做switch()的參數(shù)類型?
不支持float,double,string
————————————————
版權(quán)聲明:本文為CSDN博主「Oliver.H」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43253519/article/details/107523751