命中率高C階段面試題_第1頁
命中率高C階段面試題_第2頁
命中率高C階段面試題_第3頁
命中率高C階段面試題_第4頁
命中率高C階段面試題_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1.const意味著”只讀",下面的聲明都是什么意思? const int a; int const a; const int *a; int * const a; int const * a const; 前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。 結(jié)論:·關(guān)鍵字const的作用是為給讀你

2、代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果 你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清 理的。) · 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。 · 合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。 (1)欲阻止一個變量被改變,可以使用 const 關(guān)鍵字。在定義該 const 變量時,通常需要對它進(jìn)行初 始化,因?yàn)橐院缶蜎]

3、有機(jī)會再去改變它了;(2)對指針來說,可以指定指針本身為 const,也可以指定指針?biāo)傅臄?shù)據(jù)為 const,或二者同時指 定為 const; (3)在一個函數(shù)聲明中,const 可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值; (4)對于類的成員函數(shù),若指定其為 const 類型,則表明其是一個常函數(shù),不能修改類的成員變量; (5)對于類的成員函數(shù),有時候必須指定其返回值為 const 類型,以使得其返回值不為“左值”。 2.關(guān)鍵字volatile有什么含意?并給出三個不同的例子。一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的

4、值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子: (1)并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) (2)一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables) (3)多線程應(yīng)用中被幾個任務(wù)共享的變量 3.一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。 一個指針可以是volatile 嗎?解釋為什么。 答案: (1)是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。 (

5、2) 是的。盡管這并不很常見。一個例子是當(dāng)一個中服務(wù)子程序修該一個指向一個buffer的指針時。 4.static關(guān)鍵字有什么作用? (1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto 變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時仍維持上次的值; (2)在模塊內(nèi)的 static 全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問; (3)在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用范圍被限制在聲明 它的模塊內(nèi); (4)在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝; (5)在類中的 stati

6、c 成員函數(shù)屬于整個類所擁有,這個函數(shù)不接收 this 指針,因而只能訪問類的static 成員變量。 5. extern 在"C"中有什么作用: (1)被 extern "C"限定的函數(shù)或變量是 extern 類型的; extern是 C/C+語言中表明函數(shù)和全局變量作用范圍(可見性)的關(guān)鍵字,該關(guān)鍵字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。 (2)被 extern "C"修飾的變量和函數(shù)是按照 C 語言方式編譯和連接的; extern "C"的慣用法 (1)在 C+中引用 C 語言中的函數(shù)和

7、變量,在包含 C 語言頭文件(假設(shè)為 cExample.h)時,需進(jìn) 行下列處理: extern "C" #include "cExample.h" 而在 C語言的頭文件中,對其外部函數(shù)只能指定為 extern 類型,C語言中不支持 extern "C"聲明, 在.c 文件中包含了 extern "C"時會出現(xiàn)編譯語法錯誤。 (2)在 C 中引用 C+語言中的函數(shù)和變量時,C+的頭文件需添加 extern "C",但是在 C 語言中不 能直接引用聲明了 extern "C"的

8、該頭文件,應(yīng)該僅將 C 文件中將 C+中定義的extern "C"函數(shù)聲明為 extern 類型。 6. 堆和棧的區(qū)別?管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。申請大?。簵#簵J窍虻偷刂窋U(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域堆:是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。分配方式:堆都是動態(tài)分配的 ,動態(tài)分配由alloca函數(shù)進(jìn)行分配棧的動態(tài)分配由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)7.以下函數(shù)輸出結(jié)果是 main() int a5=1,2,3,4,5;int *ptr=(int *)(&a

9、mp;a+1);printf("%d,%d",*(a+1),*(ptr-1);答:2,5 *(a+1)就是a1,*(ptr-1)就是a4,執(zhí)行結(jié)果是2,5&a+1不是首地址+1,系統(tǒng)會認(rèn)為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大小(本例是5個int)int *ptr=(int *)(&a+1);則ptr實(shí)際是&(a5),也就是a+5原因如下:&a是數(shù)組指針,其類型為 int (*)5;而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同。a是長度為5的int數(shù)組指針,所以要加 5*sizeof(int),所以ptr實(shí)際是

10、a5,但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要),所以prt-1只會減去sizeof(int*)a,&a的地址是一樣的,但意思不一樣a是數(shù)組首地址,也就是a0的地址,&a是對象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a1,&a+1是下一個對象的地址,即a5.8.鏈表和數(shù)組的區(qū)別在哪里?二者都屬于一種數(shù)據(jù)結(jié)構(gòu)從邏輯結(jié)構(gòu)來看1.數(shù)組必須事先定義固定的長度(元素個數(shù)),不能適應(yīng)數(shù)據(jù)動態(tài)地增減的情況。當(dāng)數(shù)據(jù)增加時,可能超出原先定義的元素個數(shù);當(dāng)數(shù)據(jù)減少時,造成內(nèi)存浪費(fèi);數(shù)組可以根據(jù)下標(biāo)直接存取。2.鏈表動態(tài)地進(jìn)行存儲分配,可以適應(yīng)數(shù)據(jù)動態(tài)地增減的情況,且

11、可以方便地插入、刪除數(shù)據(jù)項(xiàng)。(數(shù)組中插入、刪除數(shù)據(jù)項(xiàng)時,需要移動其它數(shù)據(jù)項(xiàng),非常繁瑣)鏈表必須根據(jù)next指針找到下一個元素從內(nèi)存存儲來看1. (靜態(tài))數(shù)組從棧中分配空間, 對于程序員方便快速,但是自由度小2. 鏈表從堆中分配空間, 自由度大但是申請管理比較麻煩從上面的比較可以看出,如果需要快速訪問數(shù)據(jù),很少或不插入和刪除元素,就應(yīng)該用數(shù)組;相反, 如果需要經(jīng)常插入和刪除元素就需要用鏈表數(shù)據(jù)結(jié)構(gòu)了。9.結(jié)構(gòu)體struct strA int a; float b; char c; expA;printf("%ld",sizeof(expA); 輸出結(jié)果為 12 ?該問題涉及編

12、譯器的“內(nèi)存對齊”問題:現(xiàn)代計(jì)算機(jī)中內(nèi)存空間都是按照byte(字節(jié))劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實(shí)際情況是在訪問特定變量的時候經(jīng)常在特定的內(nèi)存地址訪問,這就需要各類型數(shù)據(jù)按照一定的規(guī)則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。對齊的作用和原因:各個硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取。其他平臺可能沒有這種情況,但是最常見的是如果不按照適合其平臺的要求對數(shù)據(jù)存放進(jìn)行對齊,會在存取效率上帶來損失。比如有些平臺每次讀都是從偶地址開始,如果一個int型(假設(shè)為32位)如果存放在偶地址開始的地方

13、,那么一個讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會需要2個讀周期,并對兩次讀出的結(jié)果的高低字節(jié)進(jìn)行拼湊才能得到該int數(shù)據(jù)。顯然在讀取效率上下降很多。這也是空間和時間的博弈。通常,我們寫程序的時候,不需要考慮對齊問題。編譯器會替我們選擇適合目標(biāo)平臺的對齊策略。當(dāng)然,我們也可以通知給編譯器傳遞預(yù)編譯指令而改變對指定數(shù)據(jù)的對齊方法。但是,正因?yàn)槲覀円话悴恍枰P(guān)心這個問題,所以因?yàn)榫庉嬈鲗?shù)據(jù)存放做了對齊,而我們不了解的話,常常會對一些問題感到迷惑。最常見的就是struct數(shù)據(jù)結(jié)構(gòu)的sizeof結(jié)果,出乎意料。對于結(jié)構(gòu)體來說,按成員中所占字節(jié)最大的是float類型,占用4個字節(jié),一共

14、有3個成員,所以總的占用字節(jié)為:4* 3 = 12.10.為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)? #ifndef _INCvxWorksh #define _INCvxWorksh #ifdef _cplusplus extern "C" #endif #ifdef _cplusplus #endif #endif 顯然,頭文件中的編譯宏“#ifndef _INCvxWorksh、#define _INCvxWorksh、#endif” 的作用是防止該頭文件被重復(fù)引用。 11.sprintf,strcpy,memcpy使用上有什么要注意的地方? 答:strcpy是一個字符串拷

15、貝的函數(shù),它的函數(shù)原型為strcpy(char *dst, const char *src);將src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號為'',由于拷貝的長度不是由我們自己控制的,所以這個字符串拷貝很容易出錯。 具備字符串拷貝功能的函數(shù)有memcpy,這是一個內(nèi)存拷貝函數(shù),它的函數(shù)原型為memcpy(char *dst,const char* src, unsigned int len);將長度為len的一段內(nèi)存,從src拷貝到dst中去,這個函數(shù)的長度可控。但是會有內(nèi)存疊加的問題。 sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過特定的格式,格式化到一個字符

16、串緩沖區(qū)中去。sprintf格式化的函數(shù)的長度不可控,有可能格式化后的字符串會超出緩沖區(qū)的大小,造成溢出。 12.用預(yù)處理指令#define聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 13.下面是筆試??碱},下面表示代碼的意思 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 a10; /一個有10個指針的數(shù)

17、組,該指針是指向一個整型數(shù)的。 e) int *a10; /一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。 f) int (*a)10; /一個指向有10個整型數(shù)數(shù)組的指針 g) int (*a)(int); /一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)。 h) int (*a10)(int); /一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)。 14. 以下為Windows NT下的32位C+程序,請計(jì)算sizeof的值 void Func ( char str100 ) sizeof( str ) = ? void *p = malloc

18、( 100 ); sizeof ( p ) = ? 這題很常見了,Func ( char str100 )函數(shù)中數(shù)組名作為函數(shù)形參時,在函數(shù)體內(nèi),數(shù)組名失去了本身的內(nèi)涵,僅僅只是一個指針;在失去其內(nèi)涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平臺下,指針的長度(占用內(nèi)存的大小)為4字節(jié),故sizeof( str ) 、sizeof ( p ) 都為4。 15.寫一個”標(biāo)準(zhǔn)"宏MIN ,這個宏輸入兩個參數(shù)并返回較小的一個。 #define MIN(A,B) (A) <= (B) ? (A) : (B) 這個測試是為下面的目的而設(shè)

19、的: 標(biāo)識#define在宏中應(yīng)用的基本知識。這是很重要的,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對于嵌入式系統(tǒng)來說,為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比 if-then-else 更優(yōu)化的代碼,了解這個用法是很重要的。 懂得在宏中小心地把參數(shù)用括號括起來 .我也用這個問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時會發(fā)生什么事? least = MIN(*p+, b); 結(jié)果是: (*p+) <= (b) ? (*p+) : (*p+) 這個表達(dá)式會產(chǎn)生副

20、作用,指針p會作三次+自增操作。 .main()       int a5=1,2,3,4,5;     int *ptr=(int *)(&a+1);      printf("%d,%d",*(a+1),*(ptr-1); 答:2,5      *(a+1)就是a1,*(ptr-1)就是a4,執(zhí)行結(jié)果是2,5 &a+1不是首地址+1,系統(tǒng)會認(rèn)為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大小(本例是5個int)

21、int *ptr=(int *)(&a+1); 則ptr實(shí)際是&(a5),也就是a+5 原因如下: &a是數(shù)組指針,其類型為 int (*)5; 而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同。 a是長度為5的int數(shù)組指針,所以要加 5*sizeof(int) 所以ptr實(shí)際是a5 但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要) 所以prt-1只會減去sizeof(int*) a,&a的地址是一樣的,但意思不一樣     a是數(shù)組首地址,也就是a0的地址,&a是對象(數(shù)組)首地址,

22、 a+1是數(shù)組下一元素的地址,即a1,&a+1是下一個對象的地址,即a5. 16.以下為Windows NT下的32位C+程序,請計(jì)算sizeof的值 void Func ( char str100 )      sizeof( str ) = ?    void *p = malloc( 100 ); sizeof ( p ) = ? 前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指

23、針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。 結(jié)論: 關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果 你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清 理的。)  通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。  ; 合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無意的代碼

24、修改。簡而言之,這樣可以減少bug的出現(xiàn)。     (1)欲阻止一個變量被改變,可以使用 const 關(guān)鍵字。在定義該 const 變量時,通常需要對它進(jìn)行初始化,因?yàn)橐院缶蜎]有機(jī)會再去改變它了; (2)對指針來說,可以指定指針本身為 const,也可以指定指針?biāo)傅臄?shù)據(jù)為 const,或二者同時指定為 const; (3)在一個函數(shù)聲明中,const 可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值; (4)對于類的成員函數(shù),若指定其為 const 類型,則表明其是一個常函數(shù),不能修改類的成員變量; (5)對于類的成員函數(shù),有時候必須指定其返回值為 c

25、onst 類型,以使得其返回值不為“左值”。 關(guān)鍵字volatile有什么含意?并給出三個不同的例子。   一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:   ; 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)  ; 一個中斷服務(wù)子程序中會訪問到的非自動變量(Non-automatic variables)  ; 多線程應(yīng)用中被幾個任務(wù)共享的變量

26、60; 17. 一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。  一個指針可以是volatile 嗎?解釋為什么。  下面是答案:  ; 是的。一個例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。  ; 是的。盡管這并不很常見。一個例子是當(dāng)一個中服務(wù)子程序修該一個指向一個buffer的指針時。     18.extern "C"的慣用法  (1)在 C+中引用 C 語言中的函數(shù)和變量,在包含 C 語言頭文件(假

27、設(shè)為 cExample.h)時,需進(jìn) 行下列處理: extern "C"    #include "cExample.h"    而在 C 語言的頭文件中,對其外部函數(shù)只能指定為 extern 類型,C 語言中不支持 extern "C"聲明, 在.c 文件中包含了 extern "C"時會出現(xiàn)編譯語法錯誤。 (2)在 C 中引用 C+語言中的函數(shù)和變量時,C+的頭文件需添加 extern "C",但是在 C 語言中不能直接引用聲明了 extern &qu

28、ot;C"的該頭文件,應(yīng)該僅將 C 文件中將 C+中定義的 extern "C"函數(shù)聲明為 extern 類型。 19.為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?     #ifndef _INCvxWorksh     #define _INCvxWorksh     #ifdef _cplusplus     extern "C"      #endif     /*.

29、*/     #ifdef _cplusplus          #endif     #endif /* _INCvxWorksh */  顯然,頭文件中的編譯宏“#ifndef _INCvxWorksh、#define _INCvxWorksh、#endif” 的作用 是防止該頭文件被重復(fù)引用。 20. 用變量a給出下面的定義   a) 一個整型數(shù)(An integer)   b)一個指向整型數(shù)的指針( A pointer to

30、an integer)   c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)( A pointer to a pointer to an intege)r   d)一個有10個整型數(shù)的數(shù)組( An array of 10 integers)   e) 一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(An array of 10 pointers to integers)   f) 一個指向有10個整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers) &#

31、160; g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function that takes an integer as an argument  and returns an integer)   h)一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)( An array of ten pointers to functions t hat take an integer argument and return an integer )     答案是:

32、   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 a10; / An array of 10 integers   e) int *a10; / An array of 10 pointers to integers   f) int (*a)10; / A pointer t

33、o 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 (*a10)(int); / An array of 10 pointers to functions  that take an integer argument and return an integer 21.關(guān)鍵字 const什么含義?參考答案:1)欲阻止

34、一個變量被改變,可以使用 const 關(guān)鍵字。在定義該 const變量時,通常需要對它進(jìn)行初始化,因?yàn)橐院缶蜎]有機(jī)會再去改變它了;2)對指針來說,可以指定指針本身為 const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時指定為const;3)在一個函數(shù)聲明中,const 可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;4)對于類的成員函數(shù),若指定其為 const類型,則表明其是一個常函數(shù),不能修改類的成員變量;5)對于類的成員函數(shù),有時候必須指定其返回值為 const類型,以使得其返回值不為“左值”。例如:const classA operator*(const classA

35、& a1,const classA& a2);operator*的返回結(jié)果必須是一個 const對象。如果不是,這樣的變態(tài)代碼也不會編譯出錯:22.static 關(guān)鍵字的作用?參考答案:1)函數(shù)體內(nèi) static 變量的作用范圍為該函數(shù)體,不同于 auto變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時仍維持上次的值; 2)在模塊內(nèi)的 static全局變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問; 3)在模塊內(nèi)的 static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用范圍被限制在聲明它的模塊內(nèi); 4)在類中的 static成員變量屬于整個類所擁有,對類的

36、所有對象只有一份拷貝; 5)在類中的 static 成員函數(shù)屬于整個類所擁有, 這個函數(shù)不接收 this指針,因而只能訪問類static 成員變量。 23.extern “C”的作用?參考答案: extern  "C"的主要作用就是為了能夠正確實(shí)現(xiàn) C+代碼調(diào)用其他 C語言代碼。加上extern  "C"后,會指示編譯器這部分代碼按 C 語言的進(jìn)行編譯,而不是 C+的。由于 C+支持函數(shù)重載,因此編譯器編譯函數(shù)的過程中會將函數(shù)的參數(shù)類型也加到編譯后的代碼中,而不僅僅是函數(shù)名;而 C 語言并不支持函數(shù)重載,因此編譯C 語言代碼的函數(shù)時不

37、會帶上函數(shù)的參數(shù)類型,一般只包括函數(shù)名。24.關(guān)鍵字 volatile是什么含義?并給出三個不同的例子參考答案:一個定義為 volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個變量的值了。 精確地說就是, 優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個例子:1) 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)2) 一 個 中 斷 服 務(wù) 子 程 序 中 會 訪 問 到 的 非 自 動 變 量(Non-automaticvariables)3) 多線程應(yīng)用中被幾個任務(wù)共享的變量25.do-whi

38、le 和while 的區(qū)別?參考答案:1)do.while 語句的 while 語句后要加分號“; ”2)while 語句可能一次也不執(zhí)行循環(huán)體,但 do.while語句至少執(zhí)行一次循環(huán)體。3)對于同一個問題,既可以用 while 語句,也可以用 do.while 語句。26.new、delete、malloc、free 關(guān)系參考答案:delete 會調(diào)用對象的析構(gòu)函數(shù),和 new 對應(yīng) free 只會釋放內(nèi)存,new調(diào)用構(gòu)造函數(shù)。malloc與free是C+/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C+的運(yùn)算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用 mal

39、oc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù), 對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。 由于malloc/free是庫函數(shù)而不是運(yùn)算符, 不在編譯器控制權(quán)限之內(nèi), 不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于 malloc/free。因此C+語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運(yùn)算符 new,以及一個能完成清理與釋放內(nèi)存工作的運(yùn)算符 delete。注意new/delete不是庫函數(shù)。27. sprintf,strcpy,memcpy的功能,在使用上有哪些要注意的地方.參考答案:strcpy是一個字符串拷貝的函數(shù), 它的函數(shù)原型為strcpy(char *dst,

40、constchar *src);將 src 開始的一段字符串拷貝到 dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號為'0', 由于拷貝的長度不是由我們自己控制的, 所以這個字符串拷貝很容易出錯。具備字符串拷貝功能的函數(shù)有 memcpy, 這是一個內(nèi)存拷貝函數(shù), 它的函數(shù)原型為 memcpy(char *dst, const char* src, unsigned int len);將長度為len的一段內(nèi)存,從 src 拷貝到 dst 中去,這個函數(shù)的長度可控。但是會有內(nèi)存疊加的問題。sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過特定的格式,格式化到一個字符串緩沖區(qū)中去。sprintf格式化的

41、函數(shù)的長度不可控,有可能格式化后的字符串會超出緩沖區(qū)的大小,造成溢出。28.#define DOUBLE(x)x+x, i=5*DOUBLE(5); i 是多少? 解析:答案是30本題主要考查學(xué)生對宏的基本知識的掌握,學(xué)習(xí)宏的時候,需要記住一個原則:原封不動的替換。也就是說宏只作替換,不做計(jì)算。29.寫一個宏 MIN,這個宏輸入兩個參數(shù)并返回較小的一個解析:答案是 #define MIN(A,B) (A) <= (B)? (A) : (B)這個測試是為下面的目的而設(shè)的:1)標(biāo)識#define 在宏中應(yīng)用的基本知識。這是很重要的,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的部分,宏是方便

42、產(chǎn)生嵌入代碼的唯一方法,對于嵌入式系統(tǒng)來說,為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。2)三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比if-then-else更優(yōu)化的代碼,了解這個用法是很重要的。3)懂得在宏中小心地把參數(shù)用括號括起來4)我也用這個問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時會發(fā)生什么事?least = MIN(*p+, b); 30.用預(yù)處理指令define聲明一個常數(shù),表示1 年中有多少秒(忽略閏年)解析:答案是 #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL考查知識點(diǎn):1) #defin

43、e 語法的基本知識 (例如: 不能以分號結(jié)束, 括號的使用, 等等)2)懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值,因此,直接寫出你是如何計(jì)算一年中有多少 秒而不是計(jì)算出實(shí)際的值,是更清晰而沒有代價的。3) 意識到這個表達(dá)式將使一個16位機(jī)的整型數(shù)溢出-因此要用到長整型符號L,告訴編譯器這個常數(shù)是的長整型數(shù)。4) 如果你在你的表達(dá)式中用到UL(表示無符號長整型),那么你有了一個好的起點(diǎn) 31.用宏定義交換兩個數(shù)解析:答案如下#define SWAP(a,b,type) type c; c = (a); (a) = (b); (b) = c; 32.分別給出 BOOL,int,float,指針變量 與

44、“零值”比較的 if 語句(假設(shè)變量名為 var) 解析:答案如下BOOL 型變量:if(!var)int 型變量: if(var=0)float 型變量:const float EPSINON = 0.00001;if (x >= - EPSINON) && (x <= EPSINON)指針變量: if(var=NULL)考查對 0 值判斷的 “內(nèi)功” , BOOL 型變量的 0 判斷完全可以寫成if(var=0),而 int 型變量也可以寫成 if(!var),指針變量的判斷也可以寫成if(!var),上述寫法雖然程序都能正確運(yùn)行,但是未能清晰地表達(dá)程序的意思。

45、一般的,如果想讓 if 判斷一個變量的“真” 、 “假” ,應(yīng)直接使用if(var)、if(!var), 表明其為 “邏輯” 判斷; 如果用 if 判斷一個數(shù)值型變量(short、int、long等),應(yīng)該用if(var=0),表明是與0進(jìn)行“數(shù)值”上的比較;而判斷指針則適宜用if(var=NULL),這是一種很好的編程習(xí)慣。浮點(diǎn)型變量并不精確,所以不可將 float變量用“=”或“!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“>=”或“<=”形式。如果寫成 if (x = 0.0),則判為錯,得0分。33.a)一個整型數(shù)_ b)一個指向整型數(shù)的指針_ c)一 個 指 向 指 針 的 指 針

46、, 它 指 向 的 指 針 是 指 向 一 個 整 _ d)一個有 10個整型數(shù)的數(shù)組_ e) 一個有 10 個整型數(shù)的數(shù)組,該指針是指向一個整型數(shù)的_ f)一個指向有 10個整型數(shù)數(shù)組的指針_ g)一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)_解析:答案如下a) int a; b) int *a; c) int *a; d) int a10;e) int *a10; f) int (*a)10;g) int (*a)(int); h) int (*a10)(int);34. 編寫函數(shù)_memmove 說明如下: 實(shí)現(xiàn) c 語言庫函數(shù) memmove的功能:將一塊緩沖區(qū)中的數(shù)據(jù)移動

47、到應(yīng)一塊緩沖區(qū)中。說明:不能直接調(diào)用 memmove、memcpy    之類的庫函數(shù)。 答案:void *memmove(void *dest, const void *src, size_t count)char *tmp, *s;if (dest <= src) tmp = (char *) dest;s = (char *) src;while (count-)*tmp+ = *s+;elsetmp = (char *) dest + count;s = (char *) src + count;while (count-)*-tmp = *-s;r

48、eturn dest;解析:如果目的地址小于源地址,說明目的地址最開始的部分并沒有被覆蓋重疊,就從把源地址的內(nèi)容從前向后拷貝;如果目的地址大于源地址,說明目的地址的最后面的部分沒有被覆蓋重疊,所以就把源地址的內(nèi)容從后往前拷貝。35.一個猴子吃桃一天吃桃子剩余數(shù)量的一半,感覺不夠,再吃一個,共10天吃完,問一共吃了多少桃子,寫出你的代碼。解析:主要考查學(xué)生的邏輯思維能力,以及循環(huán)的使用。答案沒有統(tǒng)一標(biāo)準(zhǔn),參考答案如下:int day,x1,x2;day = 9; x2=1;while (day>0) x1 = (x2+1)*2; x2 = x1; day -;printf("to

49、tal = %d n”,x1);36. 數(shù)組有 1000 個元素,設(shè)為數(shù)組 a1000,存放 1-1000的數(shù)值,但是現(xiàn)在有一個數(shù)值重復(fù)了,只掃描一遍數(shù)組,找出那個重復(fù)的數(shù)參考答案如下:(假設(shè)為固定的int型數(shù)組,其元素為5個)int a5 =1,2,3,4,3;int b6 = 0;int num =0;for (int i = 0; i<5; i+) num = ai; /得到 ai的值bnum+;/讓 a 數(shù)組中的值作為 b 數(shù)組的下標(biāo)if (bnum>1) /此位置加了兩次,其重復(fù)break; printf("重復(fù)的數(shù)字為: %d",num);相似題:設(shè)

50、計(jì)一個算法,要求在20個數(shù)字中(0到19)隨機(jī)選取十個數(shù)字,但是這十個數(shù)字不能重復(fù)(用C語言或者OC實(shí)現(xiàn))37.編寫一個函數(shù),作用是把一個char組成的字符串循環(huán)右移n個。比如原來是“abcdefghi”如果 n=2,移位后應(yīng)該是“hiabcdefgh”函數(shù)頭是這樣的:/pStr 是指向以'0'結(jié)尾的字符串的指針/steps 是要求移動的nvoid LoopMove ( char * pStr, int steps )/請?zhí)畛?解析: 這個試題主要考查面試者對標(biāo)準(zhǔn)庫函數(shù)的熟練程度, 在需要的時候引用庫函數(shù)可以很大程度上簡化程序編寫的工作量。參考答案如下:正確解答1:void L

51、oopMove ( char *pStr, int steps )int n = strlen( pStr ) - steps;char tmpMAX_LEN;strcpy ( tmp, pStr + n );strcpy ( tmp + steps, pStr);*( tmp + strlen ( pStr ) ) = '0'strcpy( pStr, tmp );正確解答2:void LoopMove ( char *pStr, int steps )int n = strlen( pStr ) - steps;char tmpMAX_LEN;memcpy( tmp, pS

52、tr + n, steps );memcpy(pStr + steps, pStr, n );memcpy(pStr, tmp, steps );38.找錯題 void test1()char string10;char* str1 = "0123456789"strcpy( string, str1 );解析:字符串 str1 需要 11 個字節(jié)才能存放下(包括末尾的0 ) ,而string只有10個字節(jié)的空間,strcpy會導(dǎo)致數(shù)組越界;39.找錯題void test2()char string10, str110;int i;for(i=0; i<10; i+)

53、str1 = 'a'strcpy( string, str1 );解析:如果面試者指出字符數(shù)組 str1 不能在數(shù)組內(nèi)結(jié)束可以給 3分;如果面試者指出 strcpy(string, str1)調(diào)用使得從 str1url=內(nèi)存/url起復(fù)制到string 內(nèi)存起所復(fù)制的字節(jié)數(shù)具有不確定性可以給 7分,在此基礎(chǔ)上指出庫函數(shù)strcpy工作方式的給10分;40.找錯題 void test3(char* str1)char string10;if( strlen( str1 ) <= 10 )strcpy( string, str1 );解析:; if(strlen(str1) <= 10)應(yīng)改為 if(strlen(str1) < 10),因?yàn)閟trlen的結(jié)果未統(tǒng)計(jì)0所占用的1個字節(jié)。綜上得出的結(jié)論: 考查對基本功的掌握:(1)字符串以0結(jié)尾;(2)對數(shù)組越界把握的敏感度;(3)庫函數(shù) strcpy 的工作方式;(4)對 strlen 的掌握,它沒有包括字符串末尾的0'。41.找錯題 void GetMemory( char *p )p = (char

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論