一维数组及其指针表示法

一维数组:

1
2
int ar[] = {1,2,3}    // 直接初始化,编译器自动获取数组大小
int br[3] = {1,2,3} // 直接指定大小

数组的名字 ar 其实是一个指针:

1
2
3
int *pr = ar;
printf("%d\n", pr == ar); // true
printf("%d\n", pr+1 == &ar[1]); // true

所以可以通过指针的方式访问数组:

1
printf("%d\n", *(ar+1));  //  2

二维数组及其指针表示法

二维数组:

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 型数组,故可以用如下方式访问:

1
2
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”是字符串字面量。

下面创建数组的方式和上面创建一维数组的方式等价:

1
2
int *pr;
pr = (int [3]){1,2,3}; // C99 之前是不允许的

这样在形参带数组的函数中传参更方便:

1
2
void sum(const int [], int n);
int s = sum((int []){1,2,3}, 3);

二维的复合字面量可以这么用:

1
2
int (*pr)[3];
pr = (int [][3]){{1,2,3},{4,5,6}}; // 和传统二维数组定义方式等价,更方便



root@kali ~# cat 重要声明
本博客所有原创文章,作者皆保留权利。> 转载必须包含本声明,保持文本完整,并以超链接形式注明出处【[Techliu](https://scriptboy.cn)】。查看和编写文> 章评论都需翻墙,为了更方便地获取文章信息,可订阅[RSS](https://feeds2.feedburner.com/techliu),如果您还没有 一款喜爱的阅读器,不妨试试[Inoreader.](https://www.inoreader.com)。
r oot@kali ~# Thankyou!

⬆︎TOP