C/C++基础知识10道题,你都会吗?
題目1:指針基礎(chǔ)知識(shí)
題述:描述指針數(shù)組和數(shù)組指針(指向數(shù)組的指針)的區(qū)別并舉例
考察點(diǎn):C指針的基礎(chǔ)知識(shí)
答案:考慮如下
char *q[] = {“xxx”, “xxx”, “xxx”}; 指針數(shù)組,q[0] 為一個(gè)指針
char (*p)[] = a; 數(shù)組指針,p[0] 為一個(gè)變量
時(shí)間:1min
題目2:內(nèi)存分配
題述:描述c程序內(nèi)存分配方式以及它們的區(qū)別(5分鐘)
考察點(diǎn):編程基礎(chǔ)
參考答案:
1) 從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static 變量。
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)置于處理器的指令集。
3) 從堆上分配,亦稱動(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)存的生存期由程序員決定。
題目3:讀程序找錯(cuò)
問題:【找錯(cuò)類】下面的程序用于讀取整數(shù),整數(shù)的范圍在1和從標(biāo)準(zhǔn)輸入讀取的size之間,它返回每個(gè)值出現(xiàn)的次數(shù),這個(gè)程序包含了幾個(gè)錯(cuò)誤,請(qǐng)指出。(10min)
#include <stdlib.h>
Int * frequency(int size)
{
Int *array;
Int i;
array= (int *)malloc(size *2);#獲得足夠的內(nèi)存來容納計(jì)數(shù)
#調(diào)整指針,讓它后退一個(gè)整形位置,這樣就可以使用范圍1-size的下標(biāo)
Array-=1;
#把各個(gè)元素清零
For(i=0;i<size;i++)
Array[i]=0;
#計(jì)數(shù)每個(gè)值出現(xiàn)的次數(shù),然后返回結(jié)果
While(scanf("%d",&i) == 1) #scanf的返回值代表成功讀入的個(gè)數(shù)
Array[i] +=1;
Free(array);
Return array;
}
錯(cuò)誤點(diǎn):
(1) 用字面值常量2作為整型值的長度,這個(gè)值在整型值長度為2個(gè)字節(jié)的機(jī)器上能正常工作,但在4字節(jié)整數(shù)機(jī)器上,實(shí)際分配的內(nèi)存將只是所需內(nèi)存的一半,所以應(yīng)該用sizeof
(2) 從malloc函數(shù)返回值未被檢查,如果內(nèi)存不足,將返回NULL
(3) 把指針退到數(shù)組左邊界的左邊來調(diào)整下標(biāo)的范圍或許行得通,但它違背了標(biāo)準(zhǔn)關(guān)于指針不能越過數(shù)組左邊界的規(guī)定。
(4) 指針經(jīng)過調(diào)整后,第一個(gè)元素的下標(biāo)變成了1,接著for循環(huán)將錯(cuò)誤地從0開始。在許多系統(tǒng)中,這個(gè)錯(cuò)誤將破壞malloc所使用的用于追蹤堆的信息,常常導(dǎo)致程序崩潰
(5) 數(shù)組增值前并未檢查輸入值是否位于合適的范圍內(nèi);
(6) 如果數(shù)組應(yīng)該被返回,它就不能被free掉
題目4:讀程序確認(rèn)返回值
求函數(shù)返回值,輸入x=9999;
int func(int x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
【問題】請(qǐng)寫出該函數(shù)的返回值以及分析過程。(10分鐘)
參考答案:8
解這道題的時(shí)候,如果拿出一個(gè)二進(jìn)制數(shù)來分析就會(huì)容易的多了,x=x&(x-1)實(shí)際上就是把x的二進(jìn)制形式的最后一個(gè)“1”變成“0”,x的二進(jìn)制形式有多少個(gè)“1”循環(huán)就執(zhí)行多少次。
9999/256 = 39 余 15,把這兩個(gè)數(shù)分別轉(zhuǎn)化一下就很快了
39 = 32 + 4 + 2 +1 = 00100111
15 = 0f = 00001111
所以 9999=0010011100001111,共有8個(gè)1,答案就是 8 了
考察點(diǎn):c編程基礎(chǔ)知識(shí)
題目5:實(shí)現(xiàn)strndup函數(shù)
請(qǐng)編寫以下功能的函數(shù):char *strndup(char *src, int n); 復(fù)制字符串src,返回新的指針地址,最多復(fù)制n個(gè)字節(jié)(包括字符串結(jié)束的'\0')。該題目的審查要點(diǎn)是:
l是否檢查參數(shù)的有效性:src, n;
l是否能正確使用內(nèi)存申請(qǐng)函數(shù)和指針;
l對(duì)于"最多復(fù)制n個(gè)字節(jié)"的要求考慮是否周到
題目6:合并兩個(gè)有序鏈接
合并兩個(gè)有序(升序)鏈接。
typedef struct _link_t
{
int val;
struct _link_t *next;
} link_t;
link_t* merge(link_t* ln1, link_t* ln2);
題目7
(本題答案不全):實(shí)現(xiàn)子序列最大和
給定一個(gè)int 數(shù)組,給出其中連續(xù)子序列的最大和
unsigned int foo(int *arr, size_t len);
例子1: 數(shù)組[-2,11,-4,13,-5,2]中具有最大累加和的子數(shù)組為[11,-4,13],其和為20;
例子2:[1, -3, 4, -2, -1, 6] 中具有最大累加和的子數(shù)組為[4, -2, -1, 6], 其和為7。
題目8
(本題答案不全):字符串排序
有一個(gè)由字母(大小寫)組成的字符串,要求對(duì)其排序,要求效率盡可能高且輔助空間盡可能少。
實(shí)現(xiàn) void sort(char* s); 返回寫入s。
題目9
(本題答案不全):字符串反轉(zhuǎn)
寫代碼反轉(zhuǎn)一個(gè)字符串,要求交換的次數(shù)和輔助空間盡量少。
實(shí)現(xiàn) void reverse(char* s);返回寫入s。
題目10(本題答案不全):樓梯走法
走樓梯可以一次上1級(jí),也可以一次上兩級(jí),請(qǐng)問上n級(jí)臺(tái)階有幾種走法。n不超過10K,要求效率盡可能高。
實(shí)現(xiàn) unsigned int count(unsigned int n);
?
總結(jié)
以上是生活随笔為你收集整理的C/C++基础知识10道题,你都会吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云炬随笔20211017(4)
- 下一篇: C++ 程序员自信心曲线图