1、sizeof()和strlen()的使用? 答: 1.從功能定義上,strlen函數(shù),用來求字符串的長度,sizeof函數(shù)是用來求指定變量或變量類型等所占用內(nèi)存的 大??; 2.sizeof是運(yùn)算符,而strlen是C庫函數(shù)strlen只能用char*做參數(shù),且以'\0'結(jié)尾的; 對于靜態(tài)數(shù)組處理: char str[20]="0123456789"; strlen(str)=10; //表示數(shù)組中字符串的長度 sizeof(str)=20; //表示數(shù)組變量分配的長度 對于指針處理: char *str="0123456789"; strlen(str)=10; //表示字符串的長度 sizeof(str)=4; //表示指針變量的所占內(nèi)存大小 sizeof(*str)=1; //表示'0'這個字符變量的所占內(nèi)存大小 2、 struct 和 class的區(qū)別? 答: (1)類中的成員默認(rèn)是private的,當(dāng)是可以聲明為public,private 和protected,結(jié)構(gòu)中定義的成員默認(rèn)的都是 public. (2)結(jié)構(gòu)中不允許定義成員函數(shù),當(dāng)是類中可以定義成員函數(shù). (3)結(jié)構(gòu)不可以存在繼承關(guān)系,當(dāng)是類可以存在繼承關(guān)系. 3、 strcpy(), strcat(), strcmp,strlen(), strchr(), memcpy(), memcmp(), memset()的編寫? 4、 內(nèi)存的分配方式的分配方式有幾種? 答: (1)從靜態(tài)存儲區(qū)域分配。內(nèi)存在程序編譯的時候就已經(jīng)分配好,這塊內(nèi)存在程序的整個運(yùn)行期間都存在。例如 全局變量。 (2)在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元 自動被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。 (3)從堆上分配,亦稱動態(tài)內(nèi)存分配。程序在運(yùn)行的時候用malloc或new申請任意多少的內(nèi)存,程序員自己負(fù)責(zé)在 何時用free或delete釋放內(nèi)存。動態(tài)內(nèi)存的生存期由我們決定,使用非常靈活,但問題也最多。 5,、解釋堆和棧的區(qū)別? 答: (1)棧區(qū)(stack):由編譯器自動分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中 的棧。 (2)堆區(qū)(heap):一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的 堆是兩回事,分配方式倒是類似于鏈表.(主要有:malloc/free,new/delete) 6,、枚舉的用法,以及它與宏的區(qū)別? 答: 枚舉(enum)作用:定義一組常量,而且這些常量組成了一個集合。當(dāng)我們將emun參數(shù)傳遞給函數(shù)時,如果傳遞了 一個不屬于這個集合的參數(shù),編譯器報(bào)錯。 區(qū)別: 枚舉是類型,而宏沒有類型。 枚舉將檢查其語法,而宏是簡單的文本替換。 7、 const的用法,以及聲明const變量與宏的區(qū)別? 答: const的用法有四種: a): const對象和const類型的對象; b): const指針 和 指向const的指針 及兩者結(jié)合; c): const 參數(shù)修飾 和 參數(shù)返回類型的const修飾; d): const類成員 和 const 成員函數(shù); 區(qū)別: const常量有數(shù)據(jù)類型, 而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進(jìn)行類型安全檢查,而對后者只能進(jìn)行字符 替換,沒有類型 安全檢查。而且字符替換可能會帶來料想不到的邊界效應(yīng)。 有些集成化工具可以對const常量進(jìn)行調(diào)試, 但不能對宏量進(jìn)行調(diào)試。 8、函數(shù)assert的用法? 答: 斷言assert是僅在debug版本起作用的宏,用于檢查“不應(yīng)該“發(fā)生的情況。程序員可以把a(bǔ)ssert看成一個在任 何系統(tǒng)狀態(tài)下都可以安全使用的無害測試手段。 9、用預(yù)處理指令#define 聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題)? 答: #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 10、 寫一個"標(biāo)準(zhǔn)"宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個? 答: #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 11、嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢? 答: 這個問題用幾個解決方案。我首選的方案是: while(1) { } 一些程序員更喜歡如下方案: for(;;) { } 12、用變量a給出下面的定義 a) 一個整型數(shù)(An integer) 答:a) int a; // An integer b)一個指向整型數(shù)的指針( A pointer to an integer) 答:b) int *a; // A pointer to an integer c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)( A pointer to a pointer to an intege) 答:c) int **a; // A pointer to a pointer to an integer d)一個有10個整型數(shù)的數(shù)組( An array of 10 integers) 答:d) int a[10]; // An array of 10 integers e) 一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(An array of 10 pointers to integers) 答:e) int *a[10]; // An array of 10 pointers to integers f) 一個指向有10個整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers) 答: f) int (*a)[10]; // A pointer to an array of 10 integers g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer) 答:g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer h) 一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)( An array of ten pointers to functions that take an integer argument and return an integer ) 答:h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 13、關(guān)于內(nèi)存對齊的問題以及sizof()的輸出? 答: 編譯器自動對齊的原因:為了提高程序的性能,數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對齊。原因在于 ,為了訪問未對齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問;然而,對齊的內(nèi)存訪問僅需要一次訪問。 14、 static有什么用途?(請至少說明兩種) 答: (1)在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。 (2) 在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù) 訪問。它是一個本地的全局變量。 (3) 在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個函數(shù)被限制在聲明它 的模塊的本地范圍內(nèi)使用。 15、引用與指針有什么區(qū)別? 答: (1) 引用必須被初始化,指針不必。 (2) 引用初始化以后不能被改變,指針可以改變所指的對象。 (3) 不存在指向空值的引用,但是存在指向空值的指針。 16、什么是平衡二叉樹? 答: 左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對值不大于1。 17、堆棧溢出一般是由什么原因?qū)е碌? 答: 沒有回收垃圾資源。 18、什么是預(yù)編譯?何時需要預(yù)編譯? 答: (1)總是使用不經(jīng)常改動的大型代碼體。 (2)程序由多個模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有 包含文件預(yù)編譯為一個預(yù)編譯頭。 19、隊(duì)列和棧有什么區(qū)別? 答: 隊(duì)列先進(jìn)先出;棧后進(jìn)先出。 20、數(shù)組和鏈表的區(qū)別? 答: 數(shù)組:數(shù)據(jù)順序存儲,固定大??; 鏈表:數(shù)據(jù)可以隨機(jī)存儲,大小可動態(tài)改變; 21、為什么數(shù)組名作為參數(shù),會改變數(shù)組的內(nèi)容,而其它類型如int卻不會改變變量的值? 答: 當(dāng)數(shù)組名作為參數(shù)時,傳遞的實(shí)際上是地址。而其他類型如int作為參數(shù)時,由于函數(shù)參數(shù)值實(shí)質(zhì)上是實(shí)參的一 份拷貝,被調(diào)函數(shù)內(nèi)部對形參的改變并不影響實(shí)參的值。 22、數(shù)據(jù)結(jié)構(gòu)和算法: A:查找: (1)二分法查找; (2) (3) (4) B:寫出下列算法的時間復(fù)雜度和實(shí)現(xiàn)排序: (1)冒泡排序; (2)選擇排序; (3)插入排序; (4)快速排序; (5)堆排序; (6)歸并排序; 23、編寫gbk_strlen函數(shù),計(jì)算含有漢字的字符串的長度,漢字作為一個字符處理;已知:漢字編碼為雙字節(jié),其中 首字節(jié)<0,尾字節(jié)在0~63以外;(如果一個字節(jié)是-128~127)?
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/luoweihui/archive/2008/06/29/2595831.aspx
|