|
嵌入式研發(fā)工程師面試試題大全(ANSI CC++方面的知識(shí) )
一.ANSI C/C++方面的知識(shí)
1、簡(jiǎn)答題。
1、 如何在C中初始化一個(gè)字符數(shù)組。
逐個(gè)字符賦值:char s[] = {‘A’,’B’,’C’,’D’};
字符串賦值:char s[] = {“ABCD”};
對(duì)于二維字符數(shù)組:char s[2][10] = {“cheng”,”jinzhou”};
2、 如何在C中為一個(gè)數(shù)組分配空間。
如果是棧的形式,Type s[N]定義后系統(tǒng)自動(dòng)分配空間,分配的空間大小受操作系統(tǒng)限制;
若是堆的形式,Type *s; s = (Type *)malloc(sizeof(Type) * N); 分配的空間大小不受操作系統(tǒng)限制。
3、 如何初始化一個(gè)指針數(shù)組。
這里有必要重新對(duì)比一下指針數(shù)組與數(shù)組指針的差異。
a. 指針數(shù)組:數(shù)組里存儲(chǔ)的是指針。
如:int * s[ 5 ] 表示數(shù)組s里存儲(chǔ)了5個(gè)指向整型的指針。
Char * s[ 3 ] = {“aaaaa”,”bbb”,”ccccc”} 表示數(shù)組s里存儲(chǔ)3個(gè)指向字符型的指針,分別指向字符串a(chǎn)aaaa、bbb、ccccc。
b. 數(shù)組指針:其實(shí)就是數(shù)組,里面存放的是數(shù)據(jù)。
如:int ( * s )[ 5 ] 表示數(shù)組s里存儲(chǔ)了5個(gè)整型數(shù)據(jù)。
4、 如何定義一個(gè)有10個(gè)元素的整數(shù)型指針數(shù)組。
Int * s [ 10 ];
5、 s[10]的另外一種表達(dá)方式是什么。
* ( s + 10 )
二維數(shù)組S [ 5 ][ 8 ]的表示方法:*( *(s + 5) + 8 )
7、 要使用CHAR_BIT需要包含哪個(gè)頭文件。
Include limits.h
在該頭文件里 #define CHAR_BIT 8
8、 對(duì)(-1.2345)取整是多少? -1
9、 如何讓局部變量具有全局生命期。
使用Static,局部變量就存儲(chǔ)在全局區(qū)(靜態(tài)區(qū)),便具有全局的生命期和局部的訪問控制。
10、C中的常量字符串應(yīng)在何時(shí)定義?
沒有理解到題目的意思,我只是想說明一點(diǎn),定義常量字符串后它屬于const型,不能去修改它,否則程序出錯(cuò)。
11、如何在兩個(gè).c文件中引用對(duì)方的變量。
尚不清楚,望博友能告知,萬分感謝!
12、使用malloc之前需要做什么準(zhǔn)備工作。
定義一個(gè)指針后就可以malloc了。
13、realloc函數(shù)在使用上要注意什么問題。
Realloc后返回的指針與之前malloc返回的指針指向的地址不同。
14、strtok函數(shù)在使用上要注意什么問題。
首次調(diào)用時(shí),s必須指向要分解的字符串,隨后調(diào)用要把s設(shè)成NULL
15、gets函數(shù)在使用上要注意什么問題。
這里要將Scanf( )、gets( )放在一起比較。Scanf( )是遇到空格就判斷為輸入結(jié)束,而gets( )則遇到回車才判斷為輸入結(jié)束。
16、C語言的詞法分析在長(zhǎng)度規(guī)則方面采用的是什么策略?
尚不清楚,望博友能告知,萬分感謝!
17、a+++++b所表示的是什么意思?有什么問題?
根據(jù)自增運(yùn)算符的右結(jié)合性,它是(a++)+(++b)的意思,但有的編譯器里省略括號(hào)就不能通過,同時(shí)也降低了程序可讀性。
18、如何定義Bool變量的TRUE和FALSE的值。
#define TRUE 1
#define FALSE 0
19、C語言的const的含義是什么。在定義常量時(shí),為什么推薦使用const,而不是#define。
Const是只讀的意思,它限定一個(gè)變量不允許被改變。
#define缺乏類型檢測(cè)機(jī)制,在預(yù)處理時(shí)候有可能引發(fā)錯(cuò)誤。
Const方面的其它知識(shí)擴(kuò)展:
問題1:const變量 & const 限定的內(nèi)容
下面的代碼編譯器會(huì)報(bào)一個(gè)錯(cuò)誤,請(qǐng)問,哪一個(gè)語句是錯(cuò)誤的呢?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string; // *p1 作為整體不能被修改,但p1可以修改,p1++合法
const pStr p2 = string; //p2作為一個(gè)整體,不能被修改,但是下面的p2++非法修改
p1++;
p2++;
問題2:const變量 & 字符串常量
請(qǐng)問下面的代碼有什么問題?
char *p = "i''''m hungry!"; //定義的是字符串常量
p[0]= ''''I'' //不能修改字符串常量
問題:const變量 & 字符串常量2
char a[3] = "abc" 合法嗎?使用它有什么隱患?
沒有考慮到字符串結(jié)束符‘\0’,所以會(huì)產(chǎn)生意想不到的錯(cuò)誤。
比如以下程序:
int main()
{
int i;
char p[6] = {''''a'''',''''b'''',''''c'''',''''d'''',''''e'''',''''f''''};
printf("%s",p);
while(1);
return 0;
}
運(yùn)行后顯示: abcdef@
問題3:const & 指針
類型聲明中const用來修飾一個(gè)常量,有如下兩種寫法,那么,請(qǐng)問,下面分別用const限定不可變的內(nèi)容是什么?
1)、const在前面
a. const int nValue; //nValue是const
把類型int撇開,變量nValue作為一個(gè)整體,因此 nValue是const型;
b. const char *pContent; //*pContent是const, pContent可變
把類型char撇開,變量 *pContent作為一個(gè)整體,因此 *pContent是const型;
c. const (char *) pContent;//pContent是const,*pContent可變
把類型char * 撇開,注意這里(char * )是一個(gè)整體,而變量 pContent作為一個(gè)整體,因此 pContent是const型;
d. char* const pContent; //pContent是const,*pContent可變
const與變量間沒有類型,變量 pContent作為一個(gè)整體,因此 pContent是const型;
e. const char* const pContent; //pContent和*pContent都是const
這里分為兩層,外層:把類型char 撇開,變量 * const pContent作為一個(gè)整體,因此 * pContent是const型;內(nèi)層:沒有類型,因此 pContent 是 const 型。
2)、const在后面,與上面的聲明對(duì)等 (這類型更容易判斷)
a. int const nValue; // nValue是const
const與變量之間沒有類型,const后面那部分整體是const型,因此nValue是const型
b. char const * pContent;// *pContent是const, pContent可變
const與變量之間沒有類型,const后面那部分整體是const型,因此 * pContent是const型
c. (char *) const pContent;//pContent是const,*pContent可變
const與變量之間沒有類型,const后面那部分整體是const型,因此 pContent是const型
d. char* const pContent;// pContent是const,*pContent可變
const與變量之間沒有類型,const后面那部分整體是const型,因此 pContent是const型
e. char const* const pContent;// pContent和*pContent都是const
分為兩層,外層:撇開類型char,const后面那部分整體* const pContent是const型,因此 * pContent是const型;內(nèi)層:const與pContent之間無類型,因此pContent是const型。
C++中CONST
C中常用:#define 變量名 變量值定義一個(gè)值替代,然而卻有個(gè)致命缺點(diǎn):缺乏類型檢測(cè)機(jī)制,這樣預(yù)處理理在C++中成為可能引發(fā)錯(cuò)誤的隱患,于是引入const.
const使用:
1. 用于指針的兩種情況:const是一個(gè)左結(jié)合的類型修飾符.
int const *A; //A可變,*A不可變
int *const A; //A不可變,*A可變
2.限定函數(shù)的傳遞值參數(shù):
void function(const int Var); //傳遞過來的參數(shù)在函數(shù)內(nèi)不可以改變.
3.限定函數(shù)返回值型.
const int function(); //此時(shí)const無意義
const myclassname function(); //函數(shù)返回自定義類型myclassname.
20、C語言的volatile的含義是什么。使用時(shí)會(huì)對(duì)編譯器有什么暗示。
volatile的本意是“易變的”
由于訪問寄存器的速度要快過RAM,所以編譯器一般都會(huì)作減少存取外部RAM的優(yōu)化,但有可能會(huì)讀臟數(shù)據(jù)。當(dāng)要求使用volatile 聲明的變量的值的時(shí)候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。
精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。
下面是volatile變量的幾個(gè)例子:
1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)
2). 一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables)
3). 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量
嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會(huì)帶來災(zāi)難。
Volatile的完全擴(kuò)展:
1). 一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。
是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭K莄onst因?yàn)槌绦虿粦?yīng)該試圖去修改它。
2). 一個(gè)指針可以是volatile 嗎?解釋為什么。
是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。
3). 下面的函數(shù)有什么錯(cuò)誤:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
這段代碼的有個(gè)惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
} |
|