一、基礎題
1,馮諾依曼結構的計算機硬件邏輯組成中,不包含以下哪個模塊?
A,編譯器
B,控制器
C,輸入設備
D,輸出設備
解釋:馮諾依曼由五個模塊組成:輸入設備 輸出設備 存儲器 控制器 運算器
故答案選擇:A
2,假設有一個棧,元素依次進棧的順序是A,B,C,D,E。下列不可能的出棧順序是?
A,EDCBA
B,ABCDE
C,BCDEA
D,EABCD
解釋:棧:先進后出
故答案選擇:D
3,[多選]C語言中,static關鍵字說法正確的有?
A,用static修飾的全局變量可以在運行時修改
B,用static修飾的函數,其內部變量可以傳遞給其他函數
C,在a.c文件中,有一個static修飾的函數,任何情況下都不能可能在b.c中被調用
D,其余說法均不對
解釋:參考自該篇博客static
函數體內 static 變量的作用范圍為該函數體,不同于 auto 變量, 該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值
在模塊內的 static 全局變量可以被模塊內所有函數訪問,但不能被模塊外其他函數訪問
在模塊內的static 函數只可被這一模塊內的其他函數調用,這個函數的使用范圍被限制在聲明它的模塊內
在類的static 成員變量屬于整個類所擁有,對類的所以對象只有一份拷貝
在類中的 static 成員函數屬于整個類所擁有,這個函數不接收 this 指針,因而只能訪問類的 static 成員變量
若全局變量僅在單個C文件中訪問,則可以將這個變量修改為靜態全局變量,以降低模塊間的耦合度
若全局變量僅由單個函數訪問,則可以將這個變量改為該函數的靜態局部變量,以降低模塊間的耦合度
設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,需要考慮重入問題
static在c里面可以用來修飾變量,也可以用來修飾函數。
修飾變量
int a ;
int main()
{int b ; int c* = (int *)malloc(sizeof(int));
}
變量在c里面可分為存在全局數據區、棧和堆里。
a是全局變量,b是棧變量,c是堆變量。
static對全局變量的修飾,可以認為是限制了只能是本文件引用此變量。有的程序是由好多.c文件構成。彼此可以互相引用變量,但加入static修飾之后,只能被本文件中函數引用此變量。
static對棧變量的修飾,可以認為棧變量的生命周期延長到程序執行結束時。一般來說,棧變量的生命周期由OS管理,在退棧的過程中,棧變量的生命也就結束了。但加入static修飾之后,變量已經不再存儲在棧中,而是和全局變量一起存儲。同時,離開定義它的函數后不能使用,但如再次調用定義它的函數時,它又可繼續使用, 而且保存了前次被調用后留下的值。
修飾函數
static對函數的修飾與對全局變量的修飾相似,只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用。
a.c文件
static int i; //只在a文件中用
int j; //在工程里用
static void init() //只在a文件中用
{
}
void callme() //在工程中用
{static int sum;
}
上面的全局i變量和init()函數只能用在a.c文件中,全局變量sum的作用域只在callme里。變量j和函數callme()的全局限擴充到整個工程文件。所以可以在下面的b.c中用extern關鍵字調用。extern告訴編譯器這個變量或者函數在其他文件里已經被定義了。
b.c文件
extern int j; //調用a文件里的
extern void callme(); //調用a文件里的
int main()
{...
}
extern的另外用法是當C和C++混合編程時如果c++調用的是c源文件定義的函數或者變量,那么要加extern來告訴編譯器用c方式命名函數:文件A.cpp調用a.c里面的變量i和函數callme()
extern "C" //在c++文件里調用c文件中的變量
{int j;void callme();
}
int main()
{callme();
}
全局變量有外部、靜態兩種存儲方式。
1,全局變量一般用外部存儲方式存儲,用保留字extern加以定義。此時,變量的作用域是構成整個程序的所有程序文件,也就是定義的外部變量可供其它程序文件使用。(使用這樣的全局變量一定要非常慎重,一旦產生錯誤,將波及整個程序。)
2,如果希望全局變量僅限于本程序文件使用,而其它程序文件中不能引用,這時必須將其存儲方式定義為靜態存儲方式,用保留字static加以定義。此時稱為靜態外部變量。
對全局變量加static,定義為靜態存儲方式,并不意味著是靜態存儲;而不加static,是動態存儲。兩種形式的全局變量(外部變量)都是靜態存儲方式,都是編譯時分配存儲空間,但作用域不同。使用靜態外部變量,有利于隔離錯誤,有利于模塊化程序設計。
3,全局變量的缺省存儲方式是外部存儲方式。
對局部變量采用auto方式,對全局變量采用extern方式。
故答案選擇:A、B
4,C語言中,在頭文件正常引用的情況下,執行printf("%5s",“abcdefg”);后的結果為?
A,abcde
B,abcdefg
C,cdefg
D,輸出錯誤信息
解釋:
%5s 是把變量的值保持長度5位(不足5位時),不足5位在前面用空格補齊,超過5位就不用補空格,直接顯示全部,以字符串方式輸出。
%-5s 是把變量的值保持長度5位(不足5位時),不足5位在后面用空格補齊,超過5位就不用補空格,直接顯示全部,以字符串方式輸出。
故答案選擇:A
5,在32位操作系統中,我們定義如下變量 int (*n)[10];請問調用函數sizeof(n),返回值為?
A,4
B,40
C,8
D,80
解釋:
int(*n)[10]; 是數組指針 sizeof(n)=4
int* n[10]; 是指針數組 sizeof(n)=40
在32位操作系統下,只要是指針就是4個字節,占32位。
故答案選擇:A
6,[多選]請說出const與#define相比,有何優點?
A,宏常量有數據類型,而const常量沒有數據類型
B,有些集成化的測試工具可以對const常量進行調試,但是不能對宏常量進行調試
C,編譯器可以對const進行類型安全檢查。而對#define只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤
解釋:
const常量有數據類型,而宏常量沒有數據類型
編譯器可以對const常量進行類型安全檢查,而對宏常量只能字符替換
有些集成化的調試工具能對const常量進行調試,對宏常量不能調試
故答案選擇:B、C
7,以下不是無限循環的語句為?
A,for(y=0,x=1;x>++y;x=i++) i=x;
B,for(;;x++=i);
C,while(1) {x++;}
D,for(i=10;;i–) sum+=i;
解釋:其實看是否是無限循環就看for中的第二個判斷是否退出條件即可
故答案選擇:A
8,C語言中,邏輯“真”等價于?
A,大于零的數
B,大于零的整數
C,非零的數
D,非零的整數
解釋:C語言沒有提供邏輯型的數據類型,關系(及邏輯)表達式的值“假”用數值0代表,而非零的值(系統默認用1)表示“真”。
說白了就是 零(假) 和 非零(真)
故答案選擇:C
9,(1)請寫出bool flag 與 “零值”比較的if語句
//若flag有可能為true也有可能為false
if(flag)
if(! flag)
(2)請寫出float x 與 “零值”比較的if語句
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
(3)請寫出char *p 與 “零值”比較的if語句
//字符指針有可能為空指針也有可能不為空
if (p == NULL)
if (p != NULL)
10,運行以下代碼會出現什么問題?
void getmemory(char *p)//調用GetMemory( str )后, str并未產生變化,依然是NULL.只是改變的str的一個拷貝的內存的變化
{p = (char *)malloc(100);strcpy(p,"hello world");//程序運行到這將產生錯誤//new的時候有可能內存出錯,應該在*p = (char *) malloc( num );后判斷內存是否申請成功//if (*p == NULL){//進行申請內存失敗處理}
}
int main()
{char *str = NULL;getmemory(str);printf("%s/n",str);free(str);//釋放動態創建的內存return 0;
}
參考博文
二、編程題
1,編程實現冒泡排序
我以前寫過,這里就不在敘述,可參考我的這篇博客
#include <stdio.h>
int main()
{int i,j,t,a[10];for(i=0;i<10;i++){scanf("%d",&a[i]);}for(i=0;i<9;i++)//10個數,進行9次循環,進行9趟比較{for(j=0;j<9-i;j++)//在每一趟比較中,進行9-i次比較{if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}}for(j=0;j<10;j++){printf("%d\n",a[j]);}return 0;
}
2,給定一個頭節點為head的非空單鏈表,返回鏈表的中間結點。如果有兩個中間結點,則返回第二個中間結點。
參考博文
定義一個fast和一個slow,fast每走兩步,slow就走一步, 最終返回的slow就是中間的值(鏈表的節點個數為奇數偶數都適用)
class ListNode {public int val;public ListNode next;public ListNode(int val){this.val = val;this.next = null;}
}public class TestDemo1025_1 {public ListNode head;//給定一個頭結點為 head 的非空單鏈表,返回鏈表的中間結點。
//如果有兩個中間結點,則返回第二個中間結點。public ListNode middleNode() {ListNode fast = this.head;ListNode slow = this.head;while (fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;}return slow;}
}
三、選做題
1,802.11b/g協議的非重疊信道有()個?
A,2
B,3
C,5
D,8
答案選擇:B
2,無線局域網WLAN傳輸介質就是?
A,無線電波
B,紅外線
C,載波電流
D,衛星通信
答案選擇:A
3,如果Boot Loader、內核、啟動參數以及其他的系統映像四部分在固態存儲設備上分別獨立存放,則其存儲結構的分配順序應當是:()
A,文件系統、內核、啟動參數、Bootloader
B,啟動參數、Bootloader、內核、文件系統
C,Bootloader、內核、啟動參數、文件系統
D,Bootloader、啟動參數、內核、文件系統
解釋:華為認證考試題庫中嵌入式軟件助理工程師題庫的一道題:Bootloader、啟動參數、內核、文件系統
答案選擇:D
4,Boot Loader的stage2通常使用C語言實現,以完成復雜的功能,以下哪一步驟屬于stage2的內容:()
A,為加載Boot Loader的stage2準備RAM空間
B,設置好堆棧
C,硬件設備初始化
D,將Kernel映像和根文件系統映像從flash上讀到RAM空間中
解釋:為認證考試題庫中嵌入式軟件助理工程師題庫的一道題:將kernel映像和根文件系統映像從flash上讀到RAM空間中
答案選擇:D
5,關于ARM處理器的異常的描述不正確的是()
A,復位屬于異常
B,除數為零會引起異常
C,所有異常都要返回
D,外部中斷會引起異常
答案選擇:C