1. 程式人生 > 其它 >C/C++基礎(一)

C/C++基礎(一)

1.#define和const的聯絡與區別

聯絡:#define和const都是定義常量的一種方法

區別:

(1)編譯器處理方式不同:

#define定義的常量在預處理階段展開

const常量在編譯執行階段使用

(2)型別不同:

#define定義的常量沒有型別,只進行簡單的替換,可能會有多個拷貝,佔用的記憶體空間較大

const定義的常量有型別,存放在靜態儲存區,只有一個拷貝,佔用的記憶體空間小

(3)安全檢查不同:

#define不會進行安全型別檢查

const會進行型別安全檢查,安全性更高

(4)const可以定義函式,#define不可以

2.指標和引用的區別

聯絡:指標和引用都是地址的概念

指標指向一塊記憶體,它的內容是所指記憶體的地址;

引用是某塊記憶體的別名

區別:

(1)指標有自己的一塊空間,引用只是一個別名

(2)使用sizeof,一個指標的大小是4,引用的大小為被引用物件的大小

(3)作為引數傳遞時,指標需要被解引用才能對物件進行操作,直接對引用進行修改會改變引用所指的物件

(4)指標有const,引用沒有const

(5)指標在使用中可以指向其他物件,引用只能是一個物件的引用,不能改變

(6)指標可以為空,引用不能為空

(7)指標可以多級指標,引用只有一級

(8)指標和引用使用++運算子的意義不一樣

(9)如果返回動態記憶體分配的物件或者記憶體,必須使用指標,引用可能引起記憶體洩露

3.在C++程式中呼叫被C編譯器編譯後的函式,為什麼要加extern“C”宣告?

C語言和C++語言的編譯規則不一樣,加入extern“C”宣告為了告訴系統哪些函式使用C方式編譯,哪些函式使用C++方式編譯。如果不加extern“C”,系統會提示找不到該函式。

extern“C”的主要作用是為了能夠正確實現C++程式碼呼叫其他C語言程式碼。加上extern“C”後,會指示編譯器這部分程式碼按照C語言的方式進行編譯。由於C++支援函式過載,因此編譯器編譯函式的過程中會將函式的引數型別也加到編譯後的程式碼中,而不僅僅是函式名;C語言不支援函式過載,因此編譯C語言程式碼的函式時不會帶上函式的引數型別,一般只包括函式名。這個功能十分有用,因為在C++出現以前,很多程式碼都是用C語言寫的,而且底層庫也是C語言寫的,為了更好支援原來的C程式碼和已經寫好的C語言庫,需要在C++中儘可能地支援C,而extern“C”就是其中一個策略。

4.指標型別的大小

(1)指標型別的大小是固定的,無論該指標指向哪種資料型別,在32位系統中為4位元組,64位系統為8位元組;

(2)對指標型別的變數進行加減操作,實際上是對該指標變數中儲存的地址進行加減操作,所以這些加減操作體現在記憶體地址上,就與指標指向的具體資料型別有關。指標型別本身的大小,與對指標進行的加減操作無關。