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_^*)
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。