一直以来,初始化变量和数组常采用定义时赋值的方法,今天在定义一个结构体的时候发现了一些问题,查了下相关资料发现以往的使用确实有些误区,一直没有注意到,于是搜集了下零散的资料在此记录一下。

一、以往常用的初始化方式:

1 int a=0;        /*a初始化为0*/
2 int b[10]={0};    /*b中全部元素初始化为0*/

想必一直这样使用也确实不会发现问题,按照惯性思维,把0换成1就是把全部元素初始化为1了!然而事实却并非如此,请看下面这段代码↓

 1 #include <iostream>2 #include <cstdio>3 4 using namespace std;5 6 int main()7 {8     int a=1;        /*a初始化为1*/9     int b[10]={1};    /*b中全部元素被初始化为1?*/
10     printf("a=%d\n",a);
11     for(a=0;a<10;a++)
12     {
13         printf("b[%d]=%d\n",a,b[a]);
14     }
15     return 0;
16 }

这段程序的输出结果如下↓

 1 /*2 a=13 b[0]=14 b[1]=05 b[2]=06 b[3]=07 b[4]=08 b[5]=09 b[6]=0
10 b[7]=0
11 b[8]=0
12 b[9]=0
13 Press any key to continue
14 */

可以看到,b数组中的元素只有b[0]被初始化为了1,其余元素依然为0。

通过查阅相关资料《The C++ Programming Language》,找到了以下内容:

5.2.1   数组初始化
数组可以用一个列值来初始化,例如

1 int v1[] ={1,2,3,4};
2 char v2[]={'a','b','c',0};

当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误!例如:

1 char   v3[2] ={'a','b',0};   //错误:太多的初始化值了
2 char   v3[3] ={'a','b',0};   //正确

如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为 0 !

例如:

1 int   v5[8]={1,2,3,4};

等价于

1 int   v5[8]={1,2,3,4,0,0,0,0};

注意没有如下形式的数组赋值:

1 void f()
2 {
3     v4={'c','d',0};    //错误:不是数组赋值
4 }

如果你想这样的复制的话,请使用 vector(16章第三节) 或者 valarray(22章第四节)。
  字符数组可以方便地采用字符串直接初始化(参考第五章 2.2小节)
    译注: 就是 这样啦   char   alpha []="abcdefghijklmn";

看完上述内容想必已经清楚的知道了数组应该怎样进行初始化了,此书在第六章还提及了结构体类型的的初始化问题,由于内容有过多重复,本文只列出重点。

二、集合的初始化

什么是 集合:顾名思义,集合(aggregate)就是多个事物聚集在一起,这个定义包括混合类型的集合:像struct和class等,数组就是单一类型的集合。

1、常见数组即为一种集合,此处做一个小总结:

1>为数组各个元素指定初值:

1 int a[5]={ 1, 2, 3, 4, 5};

2>如果给出的初始化值多于数组元素的个数,编译器就会给出一条出错信息。但如果给的初始化少于数据元素的个数,那将会怎么样呢?例如:

1 int b[6] = {0};

这时,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。注意,如果定义了一个数组而没有给出一列初始值时,编译器并不会去做初始化工作。所以上面的表达式是将一个数组初始化为零的简洁方法,它不需要用一个for循环,也避免了“偏移1位”错误(它可能比for循环更有效,这取决于编译器)。

3>数组还有一种叫自动计数(automatic counting)的快速初始化方法,就是让编译器按初始化值的个数去决定数组的大小:

1 int c[ ] = { 1, 2, 3, 4 };

4>对于二维数组,可以看做多个一维数组组成的集合,使用用嵌套的大括号 {{a[0]},{a[1]},{a[2]},…,{a[n-1]}} 来初始化其中的每个一维数组,更高维数组也是如此。

1 int a[3][2]={{1,1},{2,3},{3,6}};

2.关于struct关键字:
在C语言中,struct作为结构体声明的关键字,不具备C++中类的功能,而在C++中,struct与class都可用做类关键字,区别在于struct类默认public,class类默认private,因此此处只介绍C语言中struct结构体的相关内容,C++中struct类可参考class部分。

因为结构也是一种集合类型,所以它们也可以用同样的方式初始化。

1>定义一个普通结构体类型X:

1 struct X
2 {
3     int i;
4     float f;
5     char c;
6 };

使用X创建对象时,可以这样初始化其每个成员的值:

1 X x1 = { 1, 2.2, 'c' };

使用X来创建对象数组时,可以用嵌套的大括号 {{obj 1},{obj 2},{obj 3},…,{obj n}} 来初始化每一个对象:

1 X x2[3] = { {1, 1.1, 'a'}, {2, 2.2, 'b'}};

这里只列出了两个对象的初值,所以第三个对象中的数据成员分别被初始化为对应数据类型的缺省初值①

2>对于包含数组的结构体来说,初始化与上述类似,需要说明的一点是,当数组成员在结构体中定义在首位且给出不完全初始化表的情况下,初值是按照 数组的元素顺序 + 之后的成员表 依次被赋初值的,此处举例说明:

 1 #include <iostream>2 #include <cstdio>3 4 using namespace std;5 6 struct Y7 {8     int i[2];9     float f;
10     char c;
11 };
12
13 int main()
14 {
15     Y yy={1};
16     Y y[3] = {1,2,3};
17     printf("%d %d %f #%c#%d#\n", yy.i[0], yy.i[1], yy.f, yy.c, yy.c);
18     /*输出结果:1 0 0.000000 # #0#    */
19     printf("%d %d %f\n", y[0].i[0], y[0].i[1], y[0].f);
20     /*输出结果:1 2 3.000000    */
21     printf("%d %f #%d#\n", y[2].i[0], y[2].f, y[2].c);
22     /*输出结果:0 0.000000 #0#    */
23     return 0;
24 }

对于更复杂结构体也是如此,用{}逐级表明赋值关系即可。

3.关于class类

C++最主要的类的使用还用说嘛!!!不会的自己去看课本,去看构造函数和静态成员的相关内容!!!╭(╯^╰)╮

三、补充

①各种数据类型的缺省初值表

1 数据类型            缺省初始化值
2
3 int                    0
4 char                '\0x0'
5 float                0.0
6 double                0.0
7 char Array[n]        ""
8 int Array[n]        {0,0,…,0}

数组、结构体的初始化相关推荐

  1. 谈结构体struct 初始化多出的点号“.”,数组[]初始化多出的逗号“,”

    结构体struct初始化多出的点号"." 在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式,该方式是书中并没有介绍过的. 这种方式称为指定初始化(design ...

  2. c++ 数组 结构体

    接下来的一点时间我将会记录下我看的c++的一些心得体会,人贵在坚持,希望我可以一直坚持下去!!Go Fighting! 一.c++复合数据类型: 数组类型的一些注意事项: sizeof的用法: 当用在 ...

  3. FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  4. 2020.1.13 C语言学习 结构体+结构体数组+结构体指针

    结构体 结构体的形式 struct 结构体名称 { 结构体成员1; 结构体成员2; - }; 例如: 图书的结构体 struct Book {char title[128];char author[4 ...

  5. 关于指针结构体的初始化

    项目场景: 力扣141:循环链表的判定 在VS中初始化链表,涉及到节点结构体的初始化, 问题描述 在VS中初始化链表,涉及到节点结构体的初始化,一开始的写法: typedef struct ListN ...

  6. c语言中 定义结构体变量初始化,c++中的结构体:声明 定义 初始化

    什么是结构体? 之前的学习中我们知道了数组是一个容器,而且是存放固定大小数据的容器,而且存放的元素的数据类型必须要一致. 比如数据库中有这样的一条记录学号 性别 年龄 成绩 地址应该怎样存放 结构体: ...

  7. C 结构体指针初始化

    原文 C 结构体指针初始化,CSDN同步发布. 转载请注明出处,谢谢! 在使用指针之前,务必要将其初始化.这是我们最早学习 C 语言的时候,书上经常说的一个问题.在工作中,我们反而会经常忘记这条金科玉 ...

  8. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )

    文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...

  9. 用构造函数来完成结构体的初始化

    前言 说到结构体的初始化,人们会自然的想到先定义一个结构体变量,然后对其中的元素逐一赋值,以达到初始化的目的. 但是如果这样做,当结构体内变量很多时并不方便,此处介绍一种使用"构造函数&qu ...

  10. 结构体数组(SoA)与数组结构体(AoS)

    1.结构体数组(SoA) /** SoA 结构体数组定义*/ struct InnerArray {float x[LEN];float y[LEN]; }; /** CPU -> SoA 结构 ...

最新文章

  1. mysql在linux下的安装
  2. AI破解脑电波,准确率超80%!高度还原你眼中最美的ta
  3. js解决EasyUI页面渲染速度慢问题(Mask遮罩)
  4. typescript 中 let和var的区别
  5. linux中jpg文件,Linux下压缩和优化jpg与png图片的方法
  6. 1091 N-自守数
  7. 红米ac2100breed看模块_骁龙865加持,红米K30S至尊纪念版11日再开售
  8. 《深入理解分布式事务》第一章 事务的基本概念
  9. Java算法之寻找旋转数组中的最小值
  10. v8go 库手动编译 v8 golang 库手动编译
  11. 矩阵运算_Eigen使用_基本数据类型
  12. php mysql apache vbb
  13. linux RDP 共享磁盘,USB Over Network - USB Server for Linux (RDP使用讀卡機殘念)
  14. office_professional_plus_2010安装
  15. About MyBatis——有关Mybatis,自问自答系列
  16. 关于暗影骑士擎重装win10纯净版遇到的问题(使用的u盘作为系统盘)
  17. 优化方法理论合集(13)——可行域
  18. 天空卫士陆明:数据法在企业如何落地
  19. 洪涝有源淹没算法及淹没结果分析
  20. 逻辑智力测试题内附详细答案

热门文章

  1. 永磁同步直线电机仿真实例,仿真教学 maxwell16.0版本 12槽11极
  2. sap fi清账函数POSTING_INTERFACE*的使用
  3. [移动] Mosquitto简要教程(安装/使用/测试)
  4. java.lang.IllegalArgumentException介绍
  5. php hook类,基于 CodeIgniter 构建 JWT RESTfull API Server
  6. 百度提交死链的官方标准格式
  7. 区块链学习(6)-EVM有6种方式可以存储数据
  8. HSV颜色分割,RGB与HSV颜色空间的关系
  9. 阵列天线方向图合成(线阵、面阵)-附Python代码
  10. 分享前端获取微信之类图标的网站