1. 程式人生 > >要點1:指標、陣列和複合字面量

要點1:指標、陣列和複合字面量

# 一維陣列及其指標表示法 一維陣列: ```c int ar[] = {1,2,3} // 直接初始化,編譯器自動獲取陣列大小 int br[3] = {1,2,3} // 直接指定大小 ``` 陣列的名字ar其實是一個指標: ```c int *pr = ar; printf("%d\n", pr == ar); // true printf("%d\n", pr+1 == &ar[1]); // true ``` 所以可以通過指標的方式訪問陣列: ```c printf("%d\n", *(ar+1)); // 2 ``` # 二維陣列及其指標表示法 二維陣列: ```c int ar[][3] = {{1,2,3},{4,5,6}}; // 直接初始化,編譯器自動識別大小 int br[2][3] = {{1,2,3},{4,5,6}}; // 初始化時,顯示指定大小 ``` 注意,定義多維陣列的時候,只有第一個[]中可以省略長度,其他都要顯示的指定,因為通過ar+1的形式獲取第二個元素的地址的時候,需要知道每個元素的長度. 這裡的ar和br其實是一個包含2個指標元素的陣列,每個指標都指向一個大小為3的int型陣列,故可以用如下方式訪問: ```c int (*pr)[3] = ar; // 定義一個指標,型別為int [3],這裡要區別於int *pr[3] printf("%d\n", *(*(pr+1)+1)); // *(pr+1)可以取出第2個數組的首地址,所以輸出 5 ``` # 複合字面量 在C99標準以前,對於帶陣列形參的函式,情況不同,可以傳遞陣列,但是沒有等價的陣列常量。C99新增了複合字面量(compound literal)。字面量是除符號常量外的常量。例如,5是int型別字面量,81.3是double型別的字面量,'Y'是char型別的字面量,"elephant"是字串字面量。 下面建立陣列的方式和上面建立一維陣列的方式等價: ```c int *pr; pr = (int [3]){1,2,3}; // C99之前是不允許的 ``` 這樣在形參帶陣列的函式中傳參更方便: ```c void sum(const int [], int n); int s = sum((int []){1,2,3}, 3); ``` 二維的複合字面量可以這麼用: ```c int (*pr)[3]; pr = (int [][3]){{1,2,3},{4,5,6}}; // 和傳統二維陣列定義方式等價,更