2025年CC++經(jīng)典語法和指針面試題及答案_第1頁
2025年CC++經(jīng)典語法和指針面試題及答案_第2頁
2025年CC++經(jīng)典語法和指針面試題及答案_第3頁
2025年CC++經(jīng)典語法和指針面試題及答案_第4頁
2025年CC++經(jīng)典語法和指針面試題及答案_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2025年CC++經(jīng)典語法和指針面試題及答案1.簡述constint、intconst、intconst、constintconst四者的區(qū)別constint與intconst等價,表示指向常量的指針(指針指向的內(nèi)容不可修改,但指針本身可修改);intconst是常量指針(指針本身不可修改,但指向的內(nèi)容可修改);constintconst是指向常量的常量指針(指針本身和指向的內(nèi)容均不可修改)。例如:constintp1;//p1不可改,p1可改intconstp2=&a;//p2不可改,p2可改constintconstp3=&a;//p1和p1均不可改2.分析以下代碼的輸出結(jié)果(32位系統(tǒng))```cstructTest{chara;intb;shortc;chard;};intmain(){Testt;printf("%d\n",sizeof(t));return0;}```輸出結(jié)果為12。結(jié)構(gòu)體對齊規(guī)則:成員按自身大小對齊到對應(yīng)地址(char占1字節(jié),對齊1;int占4字節(jié),對齊4;short占2字節(jié),對齊2)。第一個成員chara在0地址;intb需對齊到4的倍數(shù),因此0-3中1-3為填充,b從4開始占4-7;shortc對齊2,從8開始占8-9;chard對齊1,從10開始占10;結(jié)構(gòu)體總大小需對齊到最大成員(int的4字節(jié))的倍數(shù),因此總大小為12(10+1=11,填充1字節(jié)到12)。3.說明野指針的三種常見成因及避免方法成因:①指針聲明后未初始化(指向隨機(jī)內(nèi)存);②指針指向的動態(tài)內(nèi)存被釋放(delete/free)后未置空(懸垂指針);③指針越界訪問(如指向數(shù)組最后一個元素的下一個位置)。避免方法:聲明指針時初始化為nullptr;釋放內(nèi)存后立即將指針置nullptr;使用智能指針(如unique_ptr)自動管理生命周期;避免返回局部變量的指針(局部變量棧內(nèi)存會被回收)。4.編寫函數(shù)交換兩個int變量的值,分別用指針傳遞和引用傳遞實現(xiàn)指針傳遞:```cvoidswap_ptr(inta,intb){inttemp=a;a=b;b=temp;}```引用傳遞(C++):```cppvoidswap_ref(int&a,int&b){inttemp=a;a=b;b=temp;}```區(qū)別:引用傳遞更安全(無需判空),語法更簡潔;指針傳遞需處理空指針風(fēng)險,但更靈活(可指向nullptr)。5.解釋sizeof和strlen的區(qū)別(至少列出4點)①sizeof是運算符,strlen是庫函數(shù);②sizeof計算變量/類型占用的內(nèi)存大小(包括數(shù)組的終止符),strlen計算字符串實際長度(不包含終止符'\0');③sizeof在編譯期求值(對數(shù)組傳參退化為指針時例外),strlen在運行期求值;④sizeof對空指針(如charp=nullptr)編譯報錯,strlen傳入空指針會導(dǎo)致未定義行為;⑤sizeof(“abc”)結(jié)果為4(含'\0'),strlen(“abc”)結(jié)果為3。6.分析指針數(shù)組與數(shù)組指針的差異,舉例說明指針數(shù)組是“存儲指針的數(shù)組”,本質(zhì)是數(shù)組,元素類型為指針,聲明形式:intarr[5](5個int指針的數(shù)組)。數(shù)組指針是“指向數(shù)組的指針”,本質(zhì)是指針,指向一個數(shù)組,聲明形式:int(arr)[5](指向包含5個int的數(shù)組的指針)。示例:inta[3]={1,2,3};intptr_arr[3]={&a[0],&a[1],&a[2]};//指針數(shù)組,每個元素是intint(arr_ptr)[3]=&a;//數(shù)組指針,指向int[3]類型的數(shù)組//訪問元素:(arr_ptr)[0]等價于a[0],ptr_arr[0]等價于&a[0]7.編寫一個函數(shù),使用函數(shù)指針實現(xiàn)對數(shù)組的升序或降序排序(要求通過函數(shù)指針參數(shù)指定排序規(guī)則)```cppinclude<iostream>usingnamespacestd;//排序規(guī)則函數(shù)指針類型typedefbool(CompareFunc)(int,int);//升序規(guī)則boolascending(inta,intb){returna<b;}//降序規(guī)則booldescending(inta,intb){returna>b;}//排序函數(shù)voidsortArray(intarr,intlen,CompareFunccomp){for(inti=0;i<len-1;++i){for(intj=0;j<len-i-1;++j){if(comp(arr[j],arr[j+1])){inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}//測試intmain(){intarr[]={3,1,4,2};intlen=sizeof(arr)/sizeof(arr[0]);sortArray(arr,len,ascending);//升序排序for(inti=0;i<len;++i)cout<<arr[i]<<"";//輸出1234sortArray(arr,len,descending);//降序排序for(inti=0;i<len;++i)cout<<arr[i]<<"";//輸出4321return0;}```8.說明C++中智能指針的種類及各自適用場景C++11引入三種智能指針:①unique_ptr:獨占所有權(quán)的智能指針,不可拷貝(但可移動),適用于管理獨占資源(如動態(tài)分配的單個對象或數(shù)組,需自定義刪除器管理數(shù)組時:unique_ptr<int[],decltype(&delete[])>ptr(newint[10],delete[]);)。②shared_ptr:共享所有權(quán)的智能指針,通過引用計數(shù)管理資源,當(dāng)引用計數(shù)為0時釋放資源。適用于多個對象共享同一資源的場景(如對象緩存、觀察者模式中的主題對象)。③weak_ptr:弱引用智能指針,不增加shared_ptr的引用計數(shù),用于解決shared_ptr的循環(huán)引用問題(如兩個類A和B互相持有對方的shared_ptr,導(dǎo)致引用計數(shù)無法歸零)。通過weak_ptr的lock()方法可獲取shared_ptr(若資源未釋放)。9.分析以下代碼是否存在內(nèi)存泄漏,若存在請修正```cppinclude<memory>classA{public:A(){cout<<"A構(gòu)造"<<endl;}~A(){cout<<"A析構(gòu)"<<endl;}};classB{public:B(){a=newA();}~B(){deletea;}private:Aa;};intmain(){Bb=newB();//...其他操作return0;}```存在內(nèi)存泄漏。main函數(shù)中newB()分配的內(nèi)存未釋放(b指針未被delete)。修正方法:```cpp//方法1:手動釋放intmain(){Bb=newB();//...操作deleteb;//釋放B對象,觸發(fā)B的析構(gòu)函數(shù)釋放areturn0;}//方法2:使用智能指針管理B對象intmain(){unique_ptr<B>b(newB());//離開作用域自動釋放//...操作return0;}```10.解釋“指針數(shù)組作為main函數(shù)參數(shù)”的含義,寫出main函數(shù)的標(biāo)準(zhǔn)形式并說明參數(shù)意義main函數(shù)的標(biāo)準(zhǔn)形式為:```cintmain(intargc,charargv[]);```其中:-argc(argumentcount):命令行參數(shù)的個數(shù)(至少為1,即程序名本身);-argv(argumentvector):指針數(shù)組,每個元素是char類型,指向一個命令行參數(shù)字符串。argv[0]是程序名,argv[1]是第一個參數(shù),依此類推,argv[argc]為nullptr。示例:運行程序時輸入“./testhelloworld”,則argc=3,argv[0]=“./test”,argv[1]=“hello”,argv[2]=“world”。11.說明static關(guān)鍵字在C和C++中的不同用法(至少4點)C語言中:①修飾局部變量:延長生命周期(存儲在靜態(tài)存儲區(qū)),僅初始化一次,作用域仍為局部;②修飾全局變量:限制作用域為當(dāng)前文件(外部不可見);③修飾函數(shù):限制函數(shù)作用域為當(dāng)前文件(外部不可調(diào)用)。C++中擴(kuò)展:④修飾類成員變量:屬于類而非對象,所有對象共享同一實例,需在類外定義;⑤修飾類成員函數(shù):屬于類而非對象,無this指針,只能訪問靜態(tài)成員;⑥修飾模板函數(shù)/類:每個實例化的模板擁有獨立的static變量(與C的文件作用域不同)。12.編寫代碼實現(xiàn)“通過指針遍歷二維數(shù)組”,要求使用行指針和列指針兩種方式假設(shè)二維數(shù)組為intarr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};行指針(數(shù)組指針)方式:```cint(row_ptr)[4]=arr;//指向第一行的指針for(inti=0;i<3;++i){for(intj=0;j<4;++j){printf("%d",((row_ptr+i)+j));//等價于arr[i][j]}}```列指針(普通指針)方式:```cintcol_ptr=&arr[0][0];//指向第一個元素的指針for(inti=0;i<34;++i){printf("%d",(col_ptr+i));//按行優(yōu)先順序遍歷}```13.說明const_cast的作用及使用場景,舉例說明其風(fēng)險const_cast用于移除指針或引用的const/volatile屬性(僅能轉(zhuǎn)換底層const,不能轉(zhuǎn)換頂層const)。常見場景:調(diào)用非const接口(如第三方庫函數(shù)要求非const參數(shù),但實際傳入的是const對象)。示例:```cppconstinta=10;intp=const_cast<int>(&a);//移除const屬性p=20;//未定義行為!修改const變量的結(jié)果依賴編譯器(可能寫時復(fù)制)cout<<a<<endl;//輸出可能是10(編譯器優(yōu)化,直接使用常量值)或20(取決于是否優(yōu)化)```風(fēng)險:若原對象是const類型(如示例中的a),通過const_cast修改會導(dǎo)致未定義行為;若原對象是非const類型(如intb=10;constintpb=&b;),則可以安全修改。14.分析以下代碼的輸出結(jié)果(C++)```cppinclude<iostream>usingnamespacestd;voidfunc(intp){p=20;p=nullptr;//修改指針本身}intmain(){inta=10;intptr=&a;func(ptr);cout<<"a="<<a<<",ptr="<<ptr<<endl;return0;}```輸出:a=20,ptr=0x...(具體地址,非nullptr)。解析:func的參數(shù)是值傳遞的指針(拷貝了ptr的值),函數(shù)內(nèi)部修改p會改變a的值(因為指針指向同一內(nèi)存),但修改p=nullptr僅改變局部拷貝的指針,不影響main中的ptr。因此a被修改為20,ptr仍指向a的地址。15.說明聯(lián)合體(union)與結(jié)構(gòu)體(struct)的區(qū)別(至少5點)①內(nèi)存布局:結(jié)構(gòu)體各成員占用獨立內(nèi)存(總大小≥成員大小之和),聯(lián)合體所有成員共享同一塊內(nèi)存(總大小為最大成員的大?。?;②初始化:結(jié)構(gòu)體可同時初始化多個成員,聯(lián)合體只能初始化一個成員(最后初始化的成員有效);③訪問限制:結(jié)構(gòu)體可同時訪問所有成員,聯(lián)合體同一時間只有最后賦值的成員有效(訪問其他成員會讀取共享內(nèi)存的二進(jìn)制數(shù)據(jù),可能無意義);④對齊規(guī)則:結(jié)構(gòu)體總大小需對齊到最大成員的對齊數(shù),聯(lián)合體的對齊數(shù)為最大成員的對齊數(shù);⑤使用場景:結(jié)構(gòu)體用于表示多個相關(guān)屬性(如學(xué)生信息),聯(lián)合體用于節(jié)省內(nèi)存(如不同類型的配置參數(shù),同一時間僅使用一種類型)。16.編寫代碼實現(xiàn)“使用shared_ptr管理動態(tài)數(shù)組”,并說明注意事項C++標(biāo)準(zhǔn)中shared_ptr默認(rèn)使用delete釋放資源,管理數(shù)組時需自定義刪除器(因數(shù)組需用delete[]釋放)。實現(xiàn)方式:```cppinclude<memory>usingnamespacestd;intmain(){//方式1:使用lambda自定義刪除器shared_ptr<int>arr1(newint[10],[](intp){delete[]p;});//方式2:使用std::default_delete(C++17支持shared_ptr<T[]>)shared_ptr<int[]>arr2(newint[10]);//C++17及以上,自動使用delete[]//訪問元素(arr2為C++17的數(shù)組特化版本)arr2[0]=1;return0;}```注意事項:C++11-C++14中shared_ptr管理數(shù)組需顯式提供刪除器;C++17引入shared_ptr<T[]>特化版本,支持operator[]訪問元素;避免混合使用new/delete和new[]/delete[](會導(dǎo)致未定義行為)。17.說明“指針的指針”(二級指針)的使用場景,舉例說明二級指針是指向指針的指針(intpp),常見場景:①修改函數(shù)外部的指針(如動態(tài)分配內(nèi)存并通過指針參數(shù)返回);②表示二維數(shù)組(如charargv是指針數(shù)組的指針);③實現(xiàn)多級鏈表(如雙向鏈表的節(jié)點指針的指針)。示例:函數(shù)中動態(tài)分配int并修改外部指針```cvoidallocateIntPtr(intpp){pp=(int)malloc(sizeof(int));//修改外部指針指向的地址(pp)=100;//修改指針指向的值}intmain(){intp=nullptr;allocateIntPtr(&p);//傳入p的地址(二級指針)printf("%d\n",p);//輸出100free(p);return0;}```18.分析以下代碼的內(nèi)存分配過程及潛在問題(C++)```cppchargetString(){charstr[]="hello";returnstr;}intmain(){charp=getString();printf("%s\n",p);return0;}```潛在問題:返回局部變量的指針。getString函數(shù)中str是局部數(shù)組(存儲在棧上),函數(shù)返回后棧內(nèi)存被回收,p指向的內(nèi)存已失效,printf會輸出亂碼(未定義行為)。修正方法:①返回堆內(nèi)存指針(需調(diào)用者釋放):```cppchargetString(){charstr=newchar[6];strcpy(str,"hello");returnstr;}//main中使用后delete[]p;```②返回靜態(tài)局部變量(生命周期為程序運行期):```cppchargetString(){staticcharstr[]="hello";retu

溫馨提示

  • 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

提交評論