面試中常見的C/C++問題集錦

下面的問題均是自己在面試中實際遇到的,而且在準備面試的過程中也是網上討論的很多的面試題。本着人人爲我,我爲人人的互聯網精神,特進行一下簡單的整理,方便以後的求職複習,也方便他人進行復習。

下面的總結來源於網絡加上自己的理解,深刻的理解下面的問題對自己的C/C++技術修爲是很有好處的,不僅僅是應對面試。想要理解的更深刻還是要多去讀那些經典的C和C++書籍,如《C++ primer》 《Effective C++》 《高質量C/C++程序設計指南》........

功夫下在平常,自己就是平常就是不好好的看書,許多的問題都不是很清楚,在校園招聘求職時很是被動,就C/C++語言的筆試和麪試中答的很是拙計!

持續整理中............................

1.指針和引用的區別

此問題在平常感覺很瞭解很清楚了,但是被面試官問到時,還是搖了搖頭說沒有說到本質上去。究竟本質爲何?

1>從內存分配上講,編譯器爲指針變量分配內存。但是引用變量不會另外分配內存,你可以通俗的理解爲它是所引用對象的一個別名,也就是它和它所引用的對象代表同一塊內存。

2>指針初始化以後可以改變指向的對象,而引用定義是必須初始化綁定到一個同類型的對象,而且初始化以後不允許再從新綁定到另一個對象(引用“從一而終” ^_^)。所以指針訪問對象是間接訪問,而引用訪問對象是直接訪問。

3>如果pa是指針,那麼*pa就是引用了。因此指針使用時需要解引用。

4>在作爲形參時,指針拷貝副本,而引用不拷貝副本。

5>引用不能加 const,指針可以加 const,const 的指針不可變。

6>“sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小。

7>引用是類型安全的,而指針不是 (引用比指針多了類型檢查。

至於相同點你可以理解成指針指向一塊內存,它的內容是所指內存的地址;引用是某塊內存的別名。記得當時我就是這樣回答面試官,然後他回了一句也就是沒有區別是吧,當時很無語,難道我說的不是區別嗎?哎!有時感覺自己理解了,面試時想說清楚也很不容易啊!不過技術面的面試官都很有耐心的,他會從另一個方面來考察你對這個知識的掌握程度。比如說這個問題我回答的他不滿意,他接着就問了函數的傳值和傳引用有什麼區別?

下面的博文解釋的還算詳細:

C++中指針和引用的區別 http://www.cnblogs.com/kingln/articles/1129114.html


2.堆和棧的區別

1>棧----由編譯器自動分配和釋放,函數的形參,局部變量的值等都存在於程序的棧內存中,其操作方式類似於數據結構中的棧。

2>堆----由程序員自由分配和釋放。若程序員分配後不釋放最終可由OS回收,但我們一般要在程序中把不需要的堆內存釋放掉,以避免內存的泄露。在C++中我們使用new/delete分配和釋放內存,在C語言中我們使用malloc/free分配和釋放內存。切記它們的使用要配對,切不可new/free,malloc/delete這樣混用。

關於此問題更詳細的解讀,下面有一篇網上流傳甚廣的博文:

堆和棧的區別(經典) http://www.cnblogs.com/Kevin_z/archive/2010/03/05/1679031.html


3.變量的聲明和定義的區別

這個問題平常沒有仔細的想過,在面試時被問到還真心的解釋的語無倫次。

聲明是告訴編譯器存在這樣的一個標示符,定義則是爲程序申請一塊內存。

  
int x; //這是一個定義   
extern int x; //這是聲明   
int x = 10; //這也是一個定義

char* p;  //是一個聲明
p = NULL; //就是變量的定義

下面是幾篇可以參考的博文:

C++定義與聲明區別  http://blog.csdn.net/sjxbf/article/details/6310150

變量聲明和定義  http://www.cnblogs.com/GavinDai/archive/2011/10/24/2222735.html


4.new/delete和malloc/free的區別

1>malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。他們都可用於動態內存的申請和釋放。

2>對於非內部數據類型對象在創建時需要執行構造函數,對象消亡時需要執行析構函數。malloc/free是庫函數,不是運算符,不在編譯器控制範圍內,不能把執行構造和析構函數的任務強加於malloc/free。

3>new/delete就是爲了滿足malloc/free的不足而產生的。使用new在動態分配內存的時候可以完成對象的初始化(執行對象的構造函數),使用delete釋放動態內存時會完成對象的清理工作(執行對象的析構函數)。new/delete時運算符而非函數。

4>new出來的都是帶類型信息的,而malloc出來的都會返回void指針。

5>爲什麼不給malloc/free庫函數賦予對象初始化和釋放的功能呢?我想應該是爲了兼容以前的C程序。因爲現實中存在着大量的運行良好的C程序,而C程序只能使用malloc/free動態分配內存,我們必須保證它的兼容性。



發佈了41 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章