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