一維數組及其指針表示法
一維數組:
int ar[] = {1,2,3} // 直接初始化,編譯器自動獲取數組大小
int br[3] = {1,2,3} // 直接指定大小
數組的名字ar其實是一個指針:
int *pr = ar;
printf("%d\n", pr == ar); // true
printf("%d\n", pr+1 == &ar[1]); // true
所以可以通過指針的方式訪問數組:
printf("%d\n", *(ar+1)); // 2
二維數組及其指針表示法
二維數組:
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型數組,故可以用如下方式訪問:
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"是字符串字面量。
下面創建數組的方式和上面創建一維數組的方式等價:
int *pr;
pr = (int [3]){1,2,3}; // C99之前是不允許的
這樣在形參帶數組的函數中傳參更方便:
void sum(const int [], int n);
int s = sum((int []){1,2,3}, 3);
二維的復合字面量可以這么用:
int (*pr)[3];
pr = (int [][3]){{1,2,3},{4,5,6}}; // 和傳統二維數組定義方式等價,更方便
