1. 程式人生 > >C++經典面試題(三)

C++經典面試題(三)

21.用C++寫個程式,如何判斷一個作業系統是16位還是32位的?

【標準答案】定義一個指標p,打印出sizeof(p),如果節果是4,則表示該作業系統是32位,列印結果是2,表示是16位。

22.用C++寫個程式,如何判斷一個作業系統是16位還是32位的?不能用sizeof()函式。
【參考答案】 

int a = ~0;
if( a>65536 )
{		
cout<<"32 bit"<<endl;	
}
else
{
cout<<"16 bit"<<endl;
}
這個參考答案估計參考了不少年了。。。現在大部分機器都32、64位的了,所以,應該把65536改為4294967296,來判斷機器是 32位 || 64 位

23.

void * ( * (*fp1)(int))[10];	 
float (*(* fp2)(int,int,int))(int);	 
int (* ( * fp3)())[10]();


分別表示什麼意思?
【標準答案】  

1.void * ( * (*fp1)(int))[10];  

 fp1是一個指標,指向一個函式,這個函式的引數為int型,函式的返回值是一個指標,這個指標指向一個數組,這個陣列有10個元素,每個元素是一個void*型指標。

2.float (*(* fp2)(int,int,int))(int);  

fp2是一個指標,指向一個函式,這個函式的引數為3個int型,函式的返回值是一個指標,這個指標指向一個函式,這個函式的引數為int型,函式的返回值是float型。

3.int (* ( * fp3)())[10]();  

 fp3是一個指標,指向一個函式,這個函式的引數為空,函式的返回值是一個指標,這個指標指向一個數組,這個陣列有10個元素,每個元素是一個指標,指向一個函式,這個函式的引數為空,函式的返回值是int型。

24.多型類中的虛擬函式表是Compile-Time,還是Run-Time時建立的?
【標準答案】虛擬函式表是在編譯期就建立了,各個虛擬函式這時被組織成了一個虛擬函式的入口地址的陣列.而物件的隱藏成員--虛擬函式表指標是在執行期--也就是建構函式被呼叫時進行初始化的,這是實現多型的關鍵。

25.錯誤的轉義字元是 ()
A.'\091' B.'\\'
C.'\0' D.'\'‘
【標準答案】A

A錯誤的關鍵在於,其中出現了9,這樣它就不是8進位制的轉換了。

26.若陣列名作實參而指標變數作形參,函式呼叫實參傳給形參的是 ()
A.陣列的長度B.陣列第一個元素的值C.陣列所有元素的值D.陣列第一個元素的地址
【標準答案】D

27.變數的指標含意是指變數的 ()
A.值  B.地址 C.儲存  D.名字
【標準答案】B

28.記憶體的分配方式有幾種?
【參考答案】

一、從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數。

二、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

三、從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。

29.float a,b,c ,問等式 (a+b)+c==(b+a)+c 和(a+b)+c==(a+c)+b能否成立?
【參考答案】

兩者都不行。在比較float或double時,不能簡單地比較。由於計算誤差,相等的概率很低。應判斷兩數之差是否落在區間(-e,e)內。這個e應比浮點數的精度大一個數量級。  

我想到的是另一個運算子 %。不能對float或double使用%運算子,原因和參考答案中的說法類似

30.全域性變數和區域性變數有什麼區別?是怎麼實現的?作業系統和編譯器是怎麼知道的? 
【參考答案】

1>/2>

生命週期不同:

全域性變數隨主程式建立而建立,隨主程式銷燬而銷燬;記憶體中分配在全域性資料區。

區域性變數在區域性函式內部,甚至區域性迴圈體等內部存在,退出就不存在; 分配在棧區。 

使用方式不同:

通過聲明後全域性變數程式的各個部分都可以用到;

區域性變數只能在區域性使用;  

3>

作業系統和編譯器通過記憶體分配的位置來知道的,

全域性變數分配在全域性資料段並且在程式開始執行的時候被載入。

區域性變數則分配在堆疊裡面 。

另,全域性變數會被初始化為0,而區域性變數以隨機值進行初始化

未完。。。待續(*^_v_^*)