三道c語(yǔ)言經(jīng)典面試題分享與解析

題一,sizeof 和 strlen 有何區(qū)別?
題二, strcpy、sprintf 與 memcpy 有啥區(qū)別?
題三,鏈表和數(shù)組有何區(qū)別?
題一參考答案:
sizeof 是一個(gè)操作符,strlen 是庫(kù)函數(shù)。sizeof 的參數(shù)可以是數(shù)據(jù)的類型,也可以是變量,而 strlen 只能以結(jié)尾為‘\0‘的字符串作參數(shù)。
編譯器在編譯時(shí)就計(jì)算出了sizeof 的結(jié)果。而 strlen 函數(shù)必須在運(yùn)行時(shí)才能計(jì)算出來(lái)。并且sizeof計(jì)算的是數(shù)據(jù)類型占內(nèi)存的大小,而 strlen 計(jì)算的是字符串實(shí)際的長(zhǎng)度。
數(shù)組做sizeof 的參數(shù)不退化,傳遞給 strlen 就退化為指針了。
注意:有些是操作符看起來(lái)像是函數(shù),而有些函數(shù)名看起來(lái)又像操作符,這類容易混淆的名稱一定要加以區(qū)分,否則遇到數(shù)組名這類特殊數(shù)據(jù)類型作參數(shù)時(shí)就很容易出錯(cuò)。最容易混淆為函數(shù)的操作符就是sizeof。
題二參考答案:
三者主要有以下不同之處:
操作對(duì)象不同,strcpy 的兩個(gè)操作對(duì)象均為字符串,sprintf 的操作源對(duì)象可以是多種數(shù)據(jù)類型,目的操作對(duì)象是字符串,memcpy 的兩個(gè)對(duì)象就是兩個(gè)任意可操作的內(nèi)存地址,并不限于何種數(shù)據(jù)類型。
執(zhí)行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。
實(shí)現(xiàn)功能不同,strcpy 主要實(shí)現(xiàn)字符串變量間的拷貝,sprintf 主要實(shí)現(xiàn)其他數(shù)據(jù)類型格式到字符串的轉(zhuǎn)化,memcpy 主要是內(nèi)存塊間的拷貝。
說(shuō)明:strcpy、sprintf 與memcpy都可以實(shí)現(xiàn)拷貝的功能,但是針對(duì)的對(duì)象不同,請(qǐng)根據(jù)實(shí)際需求,來(lái)選擇合適的函數(shù)實(shí)現(xiàn)拷貝功能。
題三參考答案:
數(shù)組和鏈表有以下幾點(diǎn)不同:
(1)存儲(chǔ)形式:數(shù)組是一塊連續(xù)的空間,聲明時(shí)就要確定長(zhǎng)度。鏈表是一塊可不連續(xù)的動(dòng)態(tài)空間,長(zhǎng)度可變,每個(gè)結(jié)點(diǎn)要保存相鄰結(jié)點(diǎn)指針。
(2)數(shù)據(jù)查找:數(shù)組的線性查找速度快,查找操作直接使用偏移地址。鏈表需要按順序檢索結(jié)點(diǎn),效率低。
(3)數(shù)據(jù)插入或刪除:鏈表可以快速插入和刪除結(jié)點(diǎn),而數(shù)組則可能需要大量數(shù)據(jù)移動(dòng)。
(4)越界問(wèn)題:鏈表不存在越界問(wèn)題,數(shù)組有越界問(wèn)題。
說(shuō)明:在選擇數(shù)組或鏈表數(shù)據(jù)結(jié)構(gòu)時(shí),一定要根據(jù)實(shí)際需要進(jìn)行選擇。數(shù)組便于查詢,鏈表便于插入刪除。數(shù)組節(jié)省空間但是長(zhǎng)度固定,鏈表雖然變長(zhǎng)但是占了更多的存儲(chǔ)空間。
預(yù)知更多干貨請(qǐng)關(guān)注微信公眾號(hào)百問(wèn)科技(id: baiwenkeji)。