編程語言C/C++(三)

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運算符不能再得到原數組的大小了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章