千家(jia)公(gong)司嵌入式面(mian)試題,都是(shi)比較(jiao)常(chang)見的
時間:2018-08-10 來源(yuan):未知(zhi)
關鍵字static的作(zuo)用(yong)是什么?
這個簡單的(de)問題(ti)很少有人(ren)能(neng)回答完(wan)全(quan)。在(zai)C語言中,關鍵(jian)字static有三個明顯的(de)作(zuo)用:
1). 在(zai)函數體,一個(ge)被(bei)聲(sheng)明為(wei)靜態的(de)變量(liang)在(zai)這一函數被(bei)調(diao)用過程中維持其(qi)值不(bu)變。
2). 在模塊(kuai)內(但在函(han)數體外),一個被(bei)聲明為靜態(tai)的變量(liang)可以被(bei)模塊(kuai)內所用函(han)數訪問,但不(bu)能被(bei)模塊(kuai)外其它函(han)數訪問。它是一個本地(di)的全局變量(liang)。
3). 在(zai)模塊(kuai)內,一(yi)個(ge)被(bei)(bei)聲明為靜(jing)態的(de)函(han)數只可被(bei)(bei)這一(yi)模塊(kuai)內的(de)其它函(han)數調用(yong)(yong)。那就是(shi),這個(ge)函(han)數被(bei)(bei)限制(zhi)在(zai)聲明它的(de)模塊(kuai)的(de)本地范圍內使用(yong)(yong)。
--------------------------------------------------------------------------
Const
關鍵字const是(shi)什么(me)含意?
我(wo)只要一(yi)(yi)聽(ting)到被面試者說:“const意味著常(chang)數”,我(wo)就(jiu)知(zhi)道我(wo)正在(zai)和一(yi)(yi)個業(ye)余者打交道。去年Dan Saks已經在(zai)他的文章(zhang)里完全概括了const的所有用(yong)法,因(yin)此ESP(譯者:Embedded Systems Programming)的每一(yi)(yi)位讀者應該非(fei)常(chang)熟悉const能做什(shen)么和不能做什(shen)么.
如(ru)(ru)果(guo)你(ni)從沒有讀到那篇文章,只要能說出const意味(wei)著“只讀”就可以了。盡管這個答案(an)不是完全的答案(an),但我接受它(ta)作為(wei)一個正(zheng)確(que)(que)的答案(an)。(如(ru)(ru)果(guo)你(ni)想知道更詳細的答案(an),仔細讀一下(xia)Saks的文章吧(ba)。)如(ru)(ru)果(guo)應試者能正(zheng)確(que)(que)回答這個問(wen)題,我將問(wen)他一個附加(jia)的問(wen)題:下(xia)面的聲(sheng)明都是什么意思?
Const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的(de)(de)作用是(shi)一(yi)(yi)樣,a是(shi)一(yi)(yi)個常(chang)整型(xing)數(shu)。第三個意味(wei)著(zhu)a是(shi)一(yi)(yi)個指(zhi)(zhi)(zhi)(zhi)向常(chang)整型(xing)數(shu)的(de)(de)指(zhi)(zhi)(zhi)(zhi)針(也(ye)就(jiu)是(shi),整型(xing)數(shu)是(shi)不可修改(gai)的(de)(de),但(dan)指(zhi)(zhi)(zhi)(zhi)針可以(yi))。第四個意思a是(shi)一(yi)(yi)個指(zhi)(zhi)(zhi)(zhi)向整型(xing)數(shu)的(de)(de)常(chang)指(zhi)(zhi)(zhi)(zhi)針(也(ye)就(jiu)是(shi)說(shuo),指(zhi)(zhi)(zhi)(zhi)針指(zhi)(zhi)(zhi)(zhi)向的(de)(de)整型(xing)數(shu)是(shi)可以(yi)修改(gai)的(de)(de),但(dan)指(zhi)(zhi)(zhi)(zhi)針是(shi)不可修改(gai)的(de)(de))。最(zui)后一(yi)(yi)個意味(wei)著(zhu)a是(shi)一(yi)(yi)個指(zhi)(zhi)(zhi)(zhi)向常(chang)整型(xing)數(shu)的(de)(de)常(chang)指(zhi)(zhi)(zhi)(zhi)針(也(ye)就(jiu)是(shi)說(shuo),指(zhi)(zhi)(zhi)(zhi)針指(zhi)(zhi)(zhi)(zhi)向的(de)(de)整型(xing)數(shu)是(shi)不可修改(gai)的(de)(de),同時指(zhi)(zhi)(zhi)(zhi)針也(ye)是(shi)不可修改(gai)的(de)(de))。如果應試者能(neng)(neng)正(zheng)確(que)回答這(zhe)些問(wen)題(ti),那么他(ta)就(jiu)給我(wo)留下了一(yi)(yi)個好印象(xiang)。順帶提一(yi)(yi)句,也(ye)許你可能(neng)(neng)會問(wen),即使不用關鍵字const,也(ye)還(huan)是(shi)能(neng)(neng)很(hen)容易寫出功能(neng)(neng)正(zheng)確(que)的(de)(de)程序,那么我(wo)為什(shen)么還(huan)要如此看重關鍵字const呢?我(wo)也(ye)如下的(de)(de)幾下理(li)由(you):
1). 關鍵(jian)字(zi)const的(de)(de)(de)作用(yong)(yong)是為給讀你(ni)代碼的(de)(de)(de)人傳達(da)非常(chang)有用(yong)(yong)的(de)(de)(de)信息,實際(ji)上,聲(sheng)明一個(ge)參(can)數為常(chang)量是為了告訴了用(yong)(yong)戶這個(ge)參(can)數的(de)(de)(de)應用(yong)(yong)目的(de)(de)(de)。如果你(ni)曾(ceng)花很多(duo)時間清理其它(ta)人留下(xia)的(de)(de)(de)垃圾,你(ni)就會很快學會感(gan)謝這點多(duo)余的(de)(de)(de)信息。(當然,懂得用(yong)(yong)const的(de)(de)(de)程序員很少(shao)會留下(xia)的(de)(de)(de)垃圾讓(rang)別人來清理的(de)(de)(de)。)
2). 通過給優化器一些附加的(de)信息,使用關鍵字const也許能產(chan)生(sheng)更緊湊的(de)代(dai)碼。
3). 合理地使(shi)用(yong)關鍵字const可(ke)(ke)以使(shi)編(bian)譯(yi)器很自然地保護那些(xie)不希(xi)望被改變(bian)的(de)參數,防止其被無(wu)意的(de)代碼修改。簡而(er)言之(zhi),這樣(yang)可(ke)(ke)以減少bug的(de)出現。
----------------------------------------------------------
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1); //ptr實際是&(a[5]),也就是a+5
printf("%d,%d",*(a+1),*(ptr-1));
}
輸出:2,5
------------------------------------------------------------------------
編寫strcat函數(6分)
已知strcat函數(shu)的原型是char *strcat (char *strDest, const char *strSrc);
其中strDest 是(shi)(shi)目的字符串,strSrc 是(shi)(shi)源字符串。
(1)不(bu)調用C++/C 的字符(fu)串(chuan)庫函數,請編寫函數 strcat
答:
VC源碼:
char * __cdecl strcat (char * dst, const char * src)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return( dst ); /* return dst */
}
(2)strcat能(neng)把strSrc 的(de)內(nei)容連接到strDest,為什么還要char * 類型的(de)返回(hui)值?
答:方(fang)便賦值給其他(ta)變量
-----------------------------------------------------------------------------
枚舉:
enum day
{a,b,c,d=5,e,f,g}
問a和g各是多少?
---------------------------------------------------------------------------------
用宏函數求(qiu)出一(yi)維數組的長度(du)
#define arraysize(x) (sizeof(x)/sizeof(x[0])) 一維的
#define arraytow(x) arraysize(x[0])*arraysize(x) 二維(wei)
-----------------------------------------------------------------------------
嵌入式系統總是要(yao)用戶對變(bian)(bian)量(liang)或(huo)寄(ji)存器進行位(wei)操作。給定(ding)一個(ge)整型變(bian)(bian)量(liang)a,寫(xie)兩段代(dai)碼,第一個(ge)設置(zhi)a的(de)bit 3,第二(er)個(ge)清除a 的(de)bit 3。在(zai)以上兩個(ge)操作中,要(yao)保持其它位(wei)不(bu)變(bian)(bian)。
#define BIT3 (0x1<<3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
----------------------------------------------------------------------------------------------------------------
下面的代碼輸出(chu)是什么,為什么?
Void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) puts("> 6") : puts("<= 6");
}
: >6
---------------------------------------------------------------------------------------------------------
int a=5,b=7,c;
c=a+++b;
代碼執行后
a=6
b=7
c=12
------------------------------------------------------------------
用變量a給出下面的(de)定(ding)義
a) 一個整(zheng)型數(An integer)
b) 一個(ge)指向整型數的指針(A pointer to an integer)
c) 一個(ge)指(zhi)(zhi)(zhi)(zhi)向(xiang)指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)的的指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen),它(ta)指(zhi)(zhi)(zhi)(zhi)向(xiang)的指(zhi)(zhi)(zhi)(zhi)針(zhen)(zhen)是(shi)指(zhi)(zhi)(zhi)(zhi)向(xiang)一個(ge)整型(xing)數(A pointer to a pointer to an integer)
d) 一(yi)個有10個整型(xing)數的(de)數組(An array of 10 integers)
e) 一個(ge)有(you)10個(ge)指(zhi)針的(de)數(shu)組,該指(zhi)針是指(zhi)向一個(ge)整型數(shu)的(de)(An array of 10 pointers to integers)
f) 一個(ge)指(zhi)向有10個(ge)整型數(shu)數(shu)組的(de)指(zhi)針(A pointer to an array of 10 integers)
g) 一個(ge)指(zhi)向函數(shu)的指(zhi)針,該函數(shu)有一個(ge)整型參數(shu)并返回一個(ge)整型數(shu)(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一(yi)(yi)個有(you)(you)10個指(zhi)針(zhen)的數組,該(gai)指(zhi)針(zhen)指(zhi)向(xiang)一(yi)(yi)個函數,該(gai)函數有(you)(you)一(yi)(yi)個整型參數并返回一(yi)(yi)個整型數( An array of ten pointers to functions that take an integer argument and return an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
================================================================================================================

