1. 結構體內存對齊問題?
- 按序存儲,裝得下儘量裝,裝不下換一行。
- 如果最大的基本元素小於等於機器位寬,按照最大基本元素大小對齊,否則按照機器字長對齊。
2. static作用是什麼?在C和C++中有何區別?
- static可以修飾局部變量(靜態局部變量)、全局變量(靜態全局變量)和函數,被修飾的變量存儲位置在靜態區。對於靜態局部變量,
相對於一般局部變量其生命週期長,直到程序運行結束而非函數調用結束,且只在第一次被調用時定義;對於靜態全局變量,相對於全局變
量其可見範圍被縮小,只能在本文件中可見;修飾函數時作用和修飾全局變量相同,都是爲了限定訪問域。
- C++的static除了上述兩種用途,還可以修飾類成員(靜態成員變量和靜態成員函數),靜態成員變量和靜態成員函數不屬於任何一個對象,是所有類實例所共有。
- static的數據記憶性可以滿足函數在不同調用期的通信,也可以滿足同一個類的多個實例間的通信。
- 未初始化時,static變量默認值爲0。
3. malloc和new的區別?
- malloc和free是標準庫函數,支持覆蓋;new和delete是運算符,並且支持重載。
- malloc僅僅分配內存空間,free僅僅回收空間,不具備調用構造函數和析構函數功能,用malloc分配空間存儲類的對象存在風險;new和delete除了分配回收功能外,還會調用構造函數和析構函數。
- malloc和free返回的是void類型指針(必須進行類型轉換),new和delete返回的是具體類型指針。
4. 指針和引用區別?
- 引用只是別名,不佔用具體存儲空間,只有聲明沒有定義;指針是具體變量,需要佔用存儲空間。
- 引用在聲明時必須初始化爲另一變量,一旦出現必須爲typename refname &varname形式;指針聲明和定義可以分開,可以先只聲明指針變量而不初始化,等用到時再指向具體變量。
- 引用一旦初始化之後就不可以再改變(變量可以被引用爲多次,但引用只能作爲一個變量引用);指針變量可以重新指向別的變量。
- 不存在指向空值的引用,必須有具體實體;但是存在指向空值的指針。
- 不能建立數組的引用。
5. 宏定義和函數有何區別?
- 宏在編譯時完成替換,之後被替換的文本參與編譯,相當於直接插入了代碼,運行時不存在函數調用,執行起來更快;函數調用在運行時需要跳轉到具體調用函數。
- 宏函數屬於在結構中插入代碼,沒有返回值;函數調用具有返回值。
- 宏函數參數沒有類型,不進行類型檢查;函數參數具有類型,需要檢查類型。
- 宏函數不要在最後加分號。
6. 宏定義和const區別?
- 宏替換髮生在編譯階段之前,屬於文本插入替換;const作用發生於編譯過程中。
- 宏不檢查類型;const會檢查數據類型。
- 宏定義的數據沒有分配內存空間,只是插入替換掉;const定義的變量只是值不能改變,但要分配內存空間。
7. 宏定義和typedef區別?
- 宏主要用於定義常量及書寫複雜的內容;typedef主要用於定義類型別名。
- 宏替換髮生在編譯階段之前,屬於文本插入替換;typedef是編譯的一部分。
- 宏不檢查類型;typedef會檢查數據類型。
- 宏不是語句,不在在最後加分號;typedef是語句,要加分號標識結束。
- 注意對指針的操作,typedef char * p_char和#define p_char char *區別巨大。
8. 宏定義和內聯函數(inline)區別?
- 在使用時,宏只做簡單字符串替換(編譯前)。而內聯函數可以進行參數類型檢查(編譯時),且具有返回值。
- 內聯函數本身是函數,強調函數特性,具有重載等功能。
- 內聯函數可以作爲某個類的成員函數,這樣可以使用類的保護成員和私有成員。而當一個表達式涉及到類保護成員或私有成員時,宏就不能實現了。
9. volatile有什麼作用?
- volatile定義變量的值是易變的,每次用到這個變量的值的時候都要去重新讀取這個變量的值,而不是讀寄存器內的備份。
- 多線程中被幾個任務共享的變量需要定義爲volatile類型。
10. a和&a有什麼區別?
假設數組int a[10];
int (*p)[10] = &a;
- a是數組名,是數組首元素地址,+1表示地址值加上一個int類型的大小,如果a的值是0x00000001,加1操作後變爲0x00000005。*(a + 1) = a[1]。
- &a是數組的指針,其類型爲int (*)[10](就是前面提到的數組指針),其加1時,系統會認爲是數組首地址加上整個數組的偏移(10個int型變量),值爲數組a尾元素後一個元素的地址。
- 若(int *)p ,此時輸出 *p時,其值爲a[0]的值,因爲被轉爲int *類型,解引用時按照int類型大小來讀取。
11. 數組名和指針(這裏爲指向數組首元素的指針)區別?
- 二者均可通過增減偏移量來訪問數組中的元素。
- 數組名不是真正意義上的指針,它是一種數據結構,可以理解爲指針常量,所以數組名沒有自增、自減等操作。
- 當數組名當做形參傳遞給調用函數後,就失去了原有特性,退化成一般指針,多了自增、自減操作,但sizeof運算符不能再得到原數組的大小了。