前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >要点1:指针、数组和复合字面量

要点1:指针、数组和复合字面量

作者头像
CN_Simo
发布2020-08-11 11:27:21
9470
发布2020-08-11 11:27:21
举报
文章被收录于专栏:Script Boy (CN-SIMO)Script Boy (CN-SIMO)

一维数组及其指针表示法

一维数组:

代码语言:javascript
复制
int ar[] = {1,2,3}    // 直接初始化,编译器自动获取数组大小
int br[3] = {1,2,3}   // 直接指定大小

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

代码语言:javascript
复制
int *pr = ar;
printf("%d\n", pr == ar);  // true
printf("%d\n", pr+1 == &ar[1]);  // true

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

代码语言:javascript
复制
printf("%d\n", *(ar+1));  //  2

二维数组及其指针表示法

二维数组:

代码语言:javascript
复制
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型数组,故可以用如下方式访问:

代码语言:javascript
复制
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"是字符串字面量。

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

代码语言:javascript
复制
int *pr;
pr = (int [3]){1,2,3};   // C99之前是不允许的

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

代码语言:javascript
复制
void sum(const int [], int n);
int s = sum((int []){1,2,3}, 3);

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

代码语言:javascript
复制
int (*pr)[3];
pr = (int [][3]){{1,2,3},{4,5,6}};   // 和传统二维数组定义方式等价,更方便
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一维数组及其指针表示法
  • 二维数组及其指针表示法
  • 复合字面量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档