c++ 数组初始化_每天一点C / 一维数组的初始化

这篇博客详细介绍了C++中一维数组的各种初始化方式,包括以逗号分隔的值列表初始化、创建只读数组、部分初始化、让编译器自动推导数组大小以及使用指定初始化器等。此外,还提到了未初始化数组的默认值以及计算数组长度的方法。最后,博主邀请读者加入其关于嵌入式系统和开源软件讨论的微信群。
摘要由CSDN通过智能技术生成

2ab1e592a63b3447e490c8d1e582bd19.png

哈喽,继续记录我的学习心得。

30 岁的老工程师能做到每天坚持学习,你还抱怨没时间学习吗?


一、每天一点C / 一维数组的初始化

正文目录:

1. 用以逗号分隔的值列表来初始化数组
2. 把数组设置为只读
3. 忘记初始化数组
4. 部分初始化数组
5. 让编译器自动推导数组大小
6. 指定初始化器 (designated initializer )

运行环境:

  • Ubuntu 16.04
  • gcc version 5.4.0

1. 以逗号分隔的值列表来初始化

演示 demo:

#include 
#define MONTHS 12
int main(void){
    int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int index;
    
    for (index = 0; index         printf("Month %d has %2d days.\n", index +1, days[index]);
    
    return 0;
}

运行效果:

$ gcc day_mon1.c -o day_mon
$ ./day_mon 
Month 1 has 31 days.
Month 2 has 28 days.
...
Month 12 has 31 days.

相关要点:

  • MONTHS 是符号常量,使用符号常量表示数组大小,是推荐做法

2. 把数组设置为只读

要创建只读数组,可以用 const。

演示 demo:

#define MONTHS 12
int main(void){
    const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
    days[1] = 29; // ERROR
    return 0;
}

运行效果:

$ gcc const_array.c -o const_array
const_array.c: In function ‘main’:
const_array.c:6:13: error: assignment of read-only location ‘days[1]’
     days[1] = 29; // ERROR

3. 忘记初始化数组

演示 demo:

#define SIZE 4
int main(void){
    int no_data[SIZE];  /* uninitialized array */
    int i;
    
    printf("%2s%14s\n",
           "i", "no_data[i]");
    for (i = 0; i         printf("%2d%14d\n", i, no_data[i]);
    
    return 0;
}

运行效果:

$ gcc no_data.c -o no_data
$ ./no_data
 i    no_data[i]
 0       4195872
 1             0
 2       4195488
 3             0

相关要点:

  • 打印的是内存相应位置上的现有值。

  • 可以把数组创建成不同的存储类别 (storage class),例如auto / static。上述结论仅适用于 auto 变量,即在函数内部声明,且声明时未使用关键字 static 的变量。

4. 部分初始化数组

演示 demo:

#define SIZE 4
int main(void){
    int some_data[SIZE] = {1492, 1066};
    int i;
    
    printf("%2s%14s\n",
           "i", "some_data[i]");
    for (i = 0; i         printf("%2d%14d\n", i, some_data[i]);
    
    return 0;
}

运行效果:

$ gcc some_data.c -o some_data
$ ./some_data 
 i  some_data[i]
 0          1492
 1          1066
 2             0
 3             0

相关要点:

  • 如果部分初始化数组,剩余的元素会被编译器初始化为 0。

  • 如果初始化列表的项数多于数组元素个数,gcc 5.4 编译器只会警告有多余的元素:(warning: excess elements in array initializer)。

5. 让编译器自动推导数组大小

演示 demo:

int main(void){
    const int days[] = {31,28,31,30,31,30,31,31,30,31};
    int index;
    
    for (index = 0; index sizeof days / sizeof days[0]; index++)
        printf("Month %2d has %d days.\n", index +1, days[index]);

    return 0;
}

运行效果:

$ gcc day_mon2.c -o day_mon2
$ ./day_mon2 
Month  1 has 31 days.
Month  2 has 28 days.
...
Month 10 has 31 days.

相关要点:

  • 初始化数组时省略方括号中的数字,编译器会根据初始化列表中的项数来确定数组的大小。

  • sizeof(array) / sizeof(array[0]) 常用于计算数组的长度。这种方式的弊端:无法察觉初始化列表中的项数有误,遗漏了 2 个月份。

6. 指定初始化器 (designated initializer )

该特性用于初始化指定的数组元素,例如,只初始化数组中的最后一个元素。

演示 demo:

#define MONTHS 12
int main(void){
    int days[MONTHS] = {31,28, [4] = 31,30,31, [1] = 29};
    int i;
    
    for (i = 0; i         printf("%2d  %d\n", i + 1, days[i]);
    
    return 0;
}

运行效果:

$ gcc designate.c -o designate
 1  31
 2  29
 3  0
 4  0
 5  31
 6  30
 7  31
 8  0
 9  0
10  0
11  0
12  0

相关要点:

  • 这是 C99 的特性。

  • 如果指定初始化器后面有更多的值,那么后面这些值将被用于初始化指定元素后面的元素:在days[4] 被初始化为 31,days[5] 被初始化为 30。

  • 如果再次初始化指定的元素,那么最后的初始化将会取代之前的初始化:day1[1] 的最终值为 29。

  • 如果未指定元素大小,编译器会把数组的大小设置为足够装得下初始化的值:int staff[] = {1, [6] = 4, 9, 10},staff 的长度为 9。

二、欢迎加入我的微信群

加我微信,我来拉你进群,暗号:加群

de6bb0b36e072032e472fb020ae5f61b.png

你和我各有一个苹果,如果我们交换苹果的话,我们还是只有一个苹果。但当你和我各有一个想法,我们交换想法的话,我们就都有两个想法了。

如果你也对 嵌入式系统 (Linux、RTOS、OpenWrt、Android) 和 开源软件 感兴趣,并且想和更多人互相交流学习的话,请关注我的公众号:嵌入式Hacker,一起来学习吧。

无论是关注或转发,还是打赏,都是对作者莫大的支持。对了,记得 在看和点赞 ,如果你还想看到我的推送的话。

祝各位工作顺利,家庭幸福,财源滚滚~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值