1.volatile關鍵字的作用,舉三個應用例項。
一般說來,volatile
用在如下的幾個地方:
1、中斷服務程式中修改的供其它程式檢測的變數需要加
volatile
;2、多工環境下各任務間共享的標誌應該加
volatile
;3、儲存器對映的硬體暫存器通常也要加
volatile
說明,因為每次對它的讀寫都可能有不同意義;
2.定義乙個返回值和引數都是函式指標的函式
typedef void (*p)(void)
p func(p p1);
或是:void (*) (void) func( void (*) (void))
void (*func(void (*p) (void))(void);
3.記憶體中的大小端模式?
大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;
小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低,和我們的邏輯方法一致。
4.排序演算法有哪幾種?用
c實現氣泡排序
void sort(int arr,int size){
//1.外層迴圈控制比較的輪數
//2.內層迴圈控制每輪比較的下標範圍
int i=0,j=0;
for(i=0;ifor(j=0;jif(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
常用的排序演算法
2.1氣泡排序
相鄰位置之間元素的比較
(1)演算法流程
a.比較相鄰位置的元素,如果左邊的比右邊的大,則交換兩個元素的位置
b.針對每一對相鄰位置的元素都重複上一步,從第一對到最後一對比較完畢
經過這一步,最後的元素就是這組數中的最大值
c.針對所有的元素重複以上步驟,每次對越來越少的元素進行比較,直到沒有
可以交換的元素為止
(2)演算法評價
平均時間複雜度o(n^2),
穩定,對樣本的有序性比較敏感
2.2插入排序
(1)演算法的流程
a.從第乙個元素起,假定這個元素已經有序
b.從第二個元素起,與已經有序的元素從後向前進行比較
c.如果左邊的元素大於取出的元素,則將左邊的元素賦值到下乙個位置上
繼續與有序的元素進行比較
d.如果左邊的元素小於取出的元素,則將取出的元素插入到左邊元素之後
e.重複以上步驟,直到處理完所有的元素
(2)演算法評價
平均時間複雜度o(n^2)
,穩定,對樣本的有序性比較敏感,但是賦值的次數
比氣泡排序少,所以略優於氣泡排序
2.3選擇排序演算法
(1)演算法的流程
a.從第一數起依次取出所有元素,假定取出的元素是最小值,記錄下標
b.使用假定的最小元素和後續元素依次進行比較,如果後續元素中有比
假定最小元素還小的元素,則重新記錄下標,後續元素成為了假定的最小數
c.直到假定的最小元素和後續所有元素比較完畢,互動最新的最小元素和
開始假定的最小元素
d.重複上述過程,直到所有元素排序完畢
(2)演算法評價
平均時間複雜度o(n^2),
不穩定,對樣本的有序性不敏感,比較的次數的比較多
交換的次數比較少,一般情況下略優於氣泡排序
2.4快速排序
(1)演算法的流程
a.選擇乙個中間元素作為基準值,單獨儲存起來
b.依次分別使用左邊元素和右邊元素和基準值比較,將比基準值小的元素放在左邊
將比基準值大或者相等的元素放在右邊,
c.重複以上過程,直到兩邊元素的下標重合為止,將基準值放到重合的位置上,此時
比基準值小的元素已經到了基準值左邊,比基準值大的元素已經在基準值的右邊
d.用遞迴的方式對基準值左邊和右邊的元素分別進行分組排序
(2)演算法評價
平均時間複雜度o(nlogn)
不穩定,如果每次分配都能做到均勻劃分,這種情況的排序速度最快
5.isr中斷服務子程式的錯誤
:isr不能有返回值;
isr不能傳遞引數;
isr應該是短而高效的,在
isr中做浮點運算是不明智的;
isr中不應該有重入和效能上的問題,因此不應該使用
printf()
函式。__interrupt double compute_area (double radius)
double area = pi * radius * radius;
printf("\narea = %f", area);
return area;
1) isr 不能返回乙個值。如果你不懂這個,那麼你不會被雇用的。
2) isr 不能傳遞引數。如果你沒有看到這一點,你被雇用的機會等同第一項。
3) 在許多的處理器
/編譯器中,浮點一般都是不可重入的。有些處理器
/編譯器需要讓額外的暫存器入棧,有些處理器
/編譯器就是不允許在
isr中做浮點運算。
此外,isr
應該是短而有效率的,在
isr中做浮點運算是不明智的。
4) 與第三點一脈相承,
printf
經常有重入和效能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到後兩點,那麼你的被雇用前景越來越光明了。
6.while(1) ,for(; ;),goto死迴圈用哪個?為什麼
一般for(;;)
效能更優
for(;;)
這兩個;;
空語句,編譯器一般會優掉的,直接進入死迴圈
while(1)
每迴圈一次都要判斷常量1
是不是等於零,在這裡
while
比for
多做了這點事
不過從彙編的角度來說,都是一樣的**。
goto語句通常不用,主要因為它將使程式層次不清,且不易讀,但在多層巢狀退出時,用
goto
語句則比較合理。
7.搶占式核心和非搶占式核心?
核心搶占(可搶占式核心):
即當程序位於核心空間時,有乙個更高優先順序的任務出現時,如果當前核心允許搶占,則可以將當前任務掛起,執行優先順序更高的程序。
非搶占式核心:
高優先順序的程序不能中止正在核心中執行的低優先順序的程序而搶占cpu
執行。程序一旦處於核心態
(例如使用者程序執行系統呼叫
),則除非程序自願放棄
cpu,否則該程序將一直執行下去,直至完成或退出核心。
搶占式核心的意義:
首先,這是將linux
應用於實時系統所必需的。實時系統對響應時間有嚴格的限定,當乙個實時程序被實時裝置的硬體中斷喚醒後,它應在限定的時間內被排程執行。而
linux
不能滿足這一要求,因為
linux
的核心是不可搶占的,不能確定系統在核心中的停留時間。事實上當核心首席執行官的系統呼叫時,實時程序要等到核心中執行的程序退出核心才能被排程,由此產生的響應延遲,在如今的硬體條件下,會長達
100ms
級。這對於那些要求高實時響應的系統是不能接受的。而可搶占的核心不僅對
linux
的實時應用至關重要,而且能解決
linux
對多**
(video, audio)
等要求低延遲的應用支援不夠好的缺陷。
筆試 c 筆試題
1 在派生類中通過 base 呼叫基類成員 解析 2 方法重寫使用關鍵字 override 解析 使用virtual和override關鍵字實現方法重寫 3 關於抽象類下面說法錯誤的是 選一項 a 抽象類可以包含非抽象方法 b 含有抽象方法的類一定是抽象類 c 抽象類不能被例項化 d 抽象類可以是密...
杭州ZoomVideo iOS面試題
arc和mrc了解多少,區別是什麼,arc和mrc各自有什麼優缺點,arc的引用計數的實現機制 kvo了解麼,實現機制是什麼,kvo的addobserver方法如果傳人的觀察者是弱引用物件會怎麼樣?如果多次addobserver同乙個觀察者會怎麼?如果多次remove同乙個觀察者會怎樣?後面的三問不...
筆試題 2020華為筆試
i j k p,0測試用例 120,3 12,1 題目描述 乙個矩陣,5 5,取相鄰 二個成員有乙個邊是相同的 的6個,輸入乙個6個成員列表,判斷是否滿足?矩陣成員如下 1,2,3,4,5 11,12,13,14,15 21,22,23,24,25 31,32,33,34,35 41,42,43,4...