下面的問題均是自己在面試中實際遇到的,而且在準備面試的過程中也是網上討論的很多的面試題。本着人人爲我,我爲人人的互聯網精神,特進行一下簡單的整理,方便以後的求職複習,也方便他人進行復習。
下面的總結來源於網絡加上自己的理解,深刻的理解下面的問題對自己的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動態分配內存,我們必須保證它的兼容性。