一维数组:数组
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}}; // 和传统二维数组定义方式等价,更方便