c/c++面試題

aFakeProgramer發表於2018-06-25

一、概念問答題:


1、static在C和C++裡各代表什麼含義 (語言)
解析:
1、static主要修飾變數、函式、成員變數和成員函式
2、修飾變數表明變數的生存週期,生存週期隨程式,程式結束才結束
3、修飾函式,表明函式的作用域只限於本檔案使用
4、修飾成員變數和成員函式只針對於C++才有,也表示生存週期和作用域
5、static修飾的變數預設被初始化成0
6、static修飾的變數在函式裡只會被初始化一次

2、const在C/C++裡什麼意思(語言)
解析:
1、const在c/c++中都可以用來修飾變數,在c語言中修飾的是一個只讀變數、在C++中修飾的是一個常量
2、都可以修飾函式,在c語言中修飾函式的返回值,但在C++中即可以修飾返回值也可以修飾成常函式
3、修飾指標,放在*前面修指標指向我值為常量,放在*後修飾指標為常量地址
4、修飾形參,保證傳如函式的值不被改變

3、volatile關鍵的作用(語言)
解析:
1、volatile本意是指易變的,所以一般用它來修飾變數來保證每次取值都是從記憶體中取而不是在暫存器中取,一般比較用在多執行緒中

4、new&delete 和malloc&free的區別
解析:
1、new和delete是C++用來記憶體分配和釋放的操作符,malloc和free是C語言用來分配和釋放記憶體的函式
2、new和delete一般可以使用malloc和free來作為底層實現,而且new分配記憶體不需要顯示的計算大小傳入,而malloc則必須要而且malloc的返回值為void*,所以一般申請後的空間需要強制型別轉化
3、malloc底層實現靠mmap和brk來實現,大塊的記憶體申請用mmap直接對映來提高效率,小塊的記憶體靠brk來分配,也可以用sbrk來實現,但sbrk底層也還是調的brk,brk傳入的是偏移量大小,sbrk傳入的是需要分配的地址空間
4、new申請空間會調建構函式malloc不會,delete會調解構函式free不會
5、new申請空間失敗會丟擲異常,malloc申請空間失敗返回NULL
6、new有定位符new,而且new可以通過operator new來進行過載

5、隨便寫一個函式指標、指標陣列和數 組指標
解析:
1、函式指標:int (*ptr)();
2、指標陣列:int *ptr[];
3、陣列指標:int (*ptr)[]

6、你覺得指標和陣列相同嗎?講講你理解的指標。
解析:
1、肯定不同,指標是一塊地址,而陣列的分配在棧空間上的一塊連續的地址,雖然他們都是指的地址,但他們的意義不同
2、指標分為兩塊,一是指標本身的地址,二是指標指向的地址,指標本身的地址是定義在棧上的一塊地址,但這快地址裡不能村資料,例如:int *p;p本身是在棧上存在的地址,但不能這樣使用*p=10;而指標指向的地址可以是在棧上也可以在堆上開闢,
3、當陣列做函式引數的時候會退化成指標



7、const和#define有什麼不同?
解析:
1、const在c語言中修飾的是隻讀變數,在c++中修飾的是常量
2、const對型別安全進行檢查,#define只是在編譯的時候進行巨集替換

8、給我講解你理解的結構體記憶體對齊。
解析:
1、在32位作業系統下系統預設是按4位元組對齊,即如果變數型別小於4的話就補齊4位,最後在計算整個結構體大小的時候算出來的結果也需要是4的整數倍,如果不是則補齊
2、為了提高資料讀取效率才設定以時間換空間的方法來進行記憶體對齊

9、對比一下strlen和sizeof。
解析:
1、strlen是求字串的大小,並且以'\0'結束標記,而sizeof求空間大小,它不管什麼型別都可以求而strlen只適合字串
2、strlen是函式,sizeof是運算子
3、strlen在執行的時候確定,sizeof在編譯的時候就確定了
4、sizeof只是求出當前結果,不會對資料有任何改動,例如int i=10;sizeof(i++);最後i還是等於10


轉載自:https://blog.csdn.net/zhou753099943/article/details/52202254

相關文章