【整理】關於C/C++語言面試題問答

準備找工作ing,題目不是我自己遇到的,都是網上整理來的,非常感謝各路網友的分享。

答案可能自己加工過,儘量保證正確全面,歡迎大家閱讀後指正指點指教!

只涉及C C++兩種語言,數據結構和算法另外單開一貼。


第一大類:指針和內存空間

Q: 指針和引用的區別

A:

1)指針定義時不一定要初始化,初始化後可以改變指向的對象;引用定義時必須初始化,不存在空引用,而且初始化後不能改變綁定對象;

2)指針是一種數據類型,系統爲指針分配內存; 引用不是數據類型,引用是對象的別名,系統不爲引用分配內存,引用與綁定對象共享內存;

3)使用指針訪問綁定對象要解引用,是間接訪問;使用引用訪問綁定對象是直接訪問;

4)向函數傳形參的時候,指針本身是拷貝副本的,而引用不拷貝。


Q: memcpy和strcpy的區別

A:

1)strcpy和memcpy都是標準C庫函數

2)複製的內容不同。strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符數組、整型、結構體、類等;
3)複製的方法不同。strcpy不需要指定長度,它遇到被複制字符的串結束符"\0"才結束,所以容易溢出;memcpy則是根據其第3個參數決定複製的長度;
4)用途不同。通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy。

(http://www.cnblogs.com/stoneJin/archive/2011/09/16/2179248.html)

Q: new和malloc的區別,free和delete的區別

A:

1)malloc/free是C/C++語言的標準庫函數,new/delete是C++的運算符;所以malloc/free要庫文件支持,new/delete則不要。

2)對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free;

3)new自動計算需要分配的空間,而malloc需要手工計算字節數;

4)new是類型安全的,而malloc不是,比如:
                 int* p = new float[2]; // 編譯時指出錯誤
                 int* p = malloc(2*sizeof(float)); // 編譯時無法指出錯誤

5)new將調用constructor,而malloc不能;delete將調用destructor,而free不能

6)在用delete 釋放對象數組時,留意不要丟了符號‘[]’。

(http://blog.csdn.net/hackbuteer1/article/details/6789164)



Q: 指針在16位機、32位機、64位機分別佔用多少個字節

A:

1)16位機 2字節; 32位機 4字節; 64位機 8字節。

2)函數指針可能會有例外。

(http://www.zhihu.com/question/19691905)

Q: 描述內存分配方式以及它們的區別

A:

1)有四個段(UNIX,從低地址到高地址順序爲):代碼段(code/text segment)、數據段(data segment)或全局段(global segment)、堆(heap segment)和棧(stack segment)

2)其中 數據段 可以再分成:初始數據段(initialised data segment)和BSS數據段(block start by symbol data segments),兩者也經常被叫做全局初始化區和全局未初始化區。

3)其中初始數據段還可以再分爲只讀區(read-only area)和讀寫區(read-write area),前者也叫做常量區,後者也叫做(狹義的)全局初始化區

4)代碼段大小固定,只讀,存放編譯後的程序; 數據段(或全局段)大小固定,存放全局變量、靜態變量、靜態類和命名空間成員;

堆段比較大,有程序員顯示的分配內存和釋放內存;棧段比較小,存放局部變量,程序負責分配和釋放內存。

5)沒必要區分自由存儲區(malloc/free)和堆區(new/delete),看不出意義。

6)如程序註釋

inta =0;//全局初始化區

char *p1; //全局未初始化區 
int main() 
{
    int b; //棧 
    char s[] = "abc"; //棧 
    char *p2; //棧 
    char *p3 = "123456"; //123456\0在常量區,p3在棧上。 
    static int c = 0 //全局(靜態)初始化區 
    p1 = (char *)malloc(10); 
    p2 = (char *)malloc(20); 
    //分配得來得10和20字節的區域就在堆區。 
    strcpy(p1, "123456"); 
    //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊。 
} 
(http://www-cs-faculty.stanford.edu/~eroberts/courses/cs106b/handouts/25-heap-stack-diagrams.pdf)

(http://blog.csdn.net/north23/article/details/3885168)

(http://www.questionscompiled.com/answer/cpp/3/memory-organization/)




第二大類:關鍵詞和宏定義

第三大類:類、面向對象

Q: 面向對象的三大(四大)特性

A: 

1)封裝、繼承、多態、(抽象)。


第四大類:特殊技巧

Q: There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.

A: ( ( a + b ) + abs( a – b ) ) / 2

這個效率高些,且不怕溢出;
a ^= b;
b ^= a;
a ^= b;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章