如 int *a
和 int b[]
相同點
- a和b的值都表示一片內存區域的地址,都是使用int型進行管理
- 作爲函數的形式參數沒有任何區別
區別
- a是一個變量,需要分配內存空間進行存儲,而b是程序中的一個標號,給編譯器提供地址信息,不需要進行保存。因此可以在程序中改變a,但是無法在程序中改變b。
- 可以使用
int b[]
定義數組,如int b[] = {1, 2, 3, 4}
, 但是無法使用int *a
定義數組int *a = {1, 2, 3, 4}
//語法錯誤。
至於爲什麼編譯器禁止這樣的使用:{1, 2, 3, 4}
定義的數組存放在棧中(函數內定義),如果使用int b[]
接受這個定義的話,編譯器可以根據b[n]
直接計算出相應的存儲位置,不需要將b作爲基地址進行尋址。而如果使用int *a = {1, 2, 3, 4}
的話,最終會使用a的值作爲基地址再加上偏移量進行尋址。但是a的值在編譯時無法獲取到,因此還是需要一條賦值語句int *a = b
。這樣做的話,不僅賦值耗時,而且尋址比b[n]
慢(需要多次訪問內存)。得不償失,因此編譯器禁止int *a = {1, 2, 3, 4}
這樣的定義方式。