要點1:指針、數組和複合字面量

一維數組及其指針表示法

一維數組:數組

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

二維數組及其指針表示法

二維數組:code

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"是字符串字面量。it

下面建立數組的方式和上面建立一維數組的方式等價:編譯

int *pr;
pr = (int [3]){1,2,3};   // C99以前是不容許的

這樣在形參帶數組的函數中傳參更方便:class

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}};   // 和傳統二維數組定義方式等價,更方便
相關文章
相關標籤/搜索