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