一直以为 int a[256]={0};是把a的所有元素初始化为0,int a[256]={1};是把a所有的元素初始化为1.
调试的时查看内存发现不是那么一回事,翻了一下《The C++ Programming Language》总算有定论。PDF的竟然不然复制,就把它这章翻译了,如下

5.2.1   数组初始化
数组可以用一个列值来初始化,例如
         int v1[] ={1,2,3,4};
         char v2[]={'a','b','c',0};
当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:
         char   v3[2] ={'a','b',0};   //错误:太多的初始化值了
         char   v3[3] ={'a','b',0};   //正确

如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为   0。例如
         int   v5[8]={1,2,3,4};
等价于
          int   v5[8]={1,2,3,4,0,0,0,0};

注意没有如下形式的数组赋值:
         void f()
         {
             v4={'c','d',0};   //错误:不是数组赋值
         }
如果你想这样的复制的话,请使用 vector(16章第三节) 或者 valarray(22章第四节)。
        字符数组可以方便地采用字符串直接初始化(参考第五章 2.2小节)
         译注: 就是 这样啦   char   alpha []="abcdefghijklmn";

The C++ Programming Language ,Third Edition by Bjarne Stroustrup.

、、、、、、、、、、、、、、、、、、、、、、、、、、、///

/

6.6     集合初始化
顾名思义,集合(aggregate)就是多个事物聚集在一起,这个定义包括混合类型的集合:像struct和class等,数组就是单一类型的集合。
初始化集合往往既冗长又容易出错,而C++中集合初始化(aggregate   initialization)却变得很方便而且很安全。当产生一个集合对象时,要做的只是指定初始值就行了,然后初始化工作就由编译器去承担了。这种指定可以用几种不同的风格,它取决于正在处理的集合类型。但不管是哪种情况,指定的初值都要用大括号括起来。比如一个内部类型的数组可以这样定义:
int   a[5]   =   {   1,   2,   3,   4,   5   };
如果给出的初始化值多于数组元素的个数,编译器就会给出一条出错信息。但如果给的初始化少于数据元素的个数,那将会怎么样呢?例如:
int   b[6]   =   {0};
这时,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。注意,如果定义了一个数组而没有给出一列初始值时,编译器并不会去做初始化工作。所以上面的表达式是将一个数组初始化为零的简洁方法,它不需要用一个for循环,也避免了“偏移1位”错误(它可能比for循环更有效,这取决于编译器)。
数组还有一种叫自动计数(automatic   counting)的快速初始化方法,就是让编译器按初始化值的个数去决定数组的大小:
int   c[   ]   =   {   1,   2,   3,   4   };
现在,如果决定增加另一个元素到这个数组上,只要增加一个初始化值即可,如果以此建立我们的代码,只需在一处作出修改即可。这样,在修改时出错的机会就减少了。但怎样确定这个数组的大小呢?用表达式sizeof   c   /   sizeof   *c(整个数组的大小除以第一个元素的大小)即可算出,这样,当数组大小改变时它不需要修改。
for   (   int   i   =   0;   i   <   sizeof   c   /sizeof   *c;   i++)
c[i]++;
因为结构也是一种集合类型,所以它们也可以用同样的方式初始化。因为C风格的struct的所有成员都是public型的,所以它们的值可以直接指定。
struct   X   {
int   i;
float   f;
char   c;
};
X   x1   =   {   1,   2.2,   ‘c’   };
如果有一个这种struct的数组,也可以用嵌套的大括号来初始化每一个对象:
X   x2[3]   =   {   {1,   1.1,   ‘a’},   {2,   2.2,   ‘b’}};
这里,第三个对象被初始化为零。
如果struct中有私有成员(典型的情况就是C++中设计良好的类),或即使所有成员都是公共成员,但有构造函数,情况就不一样了。在上例中,初始值被直接赋给了集合中的每个元素,但构造函数是通过正式的接口来强制初始化的。这里,构造函数必须被调用来完成初始化,因此,如果有一个下面的struct类型:
struct   Y   {
float   f;
int   i;
Y(int   a);
};
必须指示构造函数调用,最好的方法像下面这样:
Y   y1[   ]   =   {   Y(1),   Y(2),   Y(3)   };
这样就得到了三个对象和进行了三次构造函数调用。只要有构造函数,无论是所有成员都是公共的struct还是一个带私有成员的class,所有的初始化工作都必须通过构造函数来完成,即使正在对一个集合初始化。
下面是多构造函数参数的又一个例子:
//:   C06:Multiarg.cpp
//   From   Thinking   in   C++,   2nd   Edition
//   Available   at   http://www.BruceEckel.com
//   (c)   Bruce   Eckel   2000
//   Copyright   notice   in   Copyright.txt
//   Multiple   constructor   arguments
//   with   aggregate   initialization
#include   <iostream>
using   namespace   std;

class   Z   {
    int   i,   j;
public:
    Z(int   ii,   int   jj);
    void   print();
};

Z::Z(int   ii,   int   jj)   {
    i   =   ii;
    j   =   jj;
}

void   Z::print()   {
    cout   < <   "i   =   "   < <   i   < <   ",   j   =   "   < <   j   < <   endl;
}

int   main()   {
    Z   zz[]   =   {   Z(1,2),   Z(3,4),   Z(5,6),   Z(7,8)   };
    for(int   i   =   0;   i   <   sizeof   zz   /   sizeof   *zz;   i++)
        zz[i].print();
}   ///:~
注意:这看起来就好象对数组中的每个对象都调用显式的构造函数。

、、、、、、、、、、、、

/

该问题涉及到数据类型初始化的问题,现将C语言中数据类型初始化总结如下

简单变量的初始化形式如下: 数据类型 变量名=初始化值;
   例如,定义整型变量a,并给其初始化值10的语句如下
   int a=10;

数组的初始化,需要通过一常量数据列表,对其数组元素分别进行初始化,形式如下:
  数据类型 数组名称〔数组长度〕={初始化值1,初始化值2,…, 初始化值n};

例如,定义长度为5的整型数组,并对其初始化的语句如下:
  int A[5]={20,21,0,3,4};

结构体变量的初始化方式与数组类似,分别给结构体的成员变量以初始值,而结构体成员变量的初始化遵循简单变量或数组的初始化方法。具体的形式如下:
  struct 结构体标识符
  {
    成员变量列表;
     …
  };
  struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };
  例如,定义struct Point类型变量,并初始化的语句如下:
  struct Point oP1={0.0,0.2,0.3};
  struct Point类型变量oP1的三个成员变量的值分别为
  oP1.x=0.0,
  oP1.y=0.2
  oP1.z=0.3
由于定义结构体变量有三种方法,因此初始化结构体变量的方法对应有三种,上面已经介绍了其中的一种形式,其他两种形式如下:
struct Point
{
  double x;
  double y;
  double z;
} oP1={0.0,0.2,0.3}; struct
{
  double x;
  double y;
  double z;
} oP1={0.0,0.2,0.3};
在初始化结构体变量时候,既可以初始化其全部成员变量,也可以仅仅对其中部分的成员变量进行初始化。例如:
struct Student
{
  long id;
  char name[20];
  char sex;
}a= {0};
其相当于a.id=0;a.name=“”;a.sex=‘\0x0’。
仅仅对其中部分的成员变量进行初始化,要求初始化的数据至少有一个,其他没有初始化的成员变量由系统完成初始化,为其提供缺省的初始化值。各种基本数据类型的成员变量初始化缺省值如表9-1所示。

数据类型
缺省初始化值
Int                   0
Char                ‘\0x0’
float                0.0
double               0.0
char Array[n]        ”
int Array[n]         {0,0…,0}

对于复杂结构体类型变量的初始化,同样遵循上述规律,对结构体成员变量分别赋予初始化值。例如:
struct Line
{
int id;
struct Point StartPoint;
struct Point EndPoint;
}oLine1={0,
{0,0,0},
{100,0,0}
};
其中常量0用于初始化oLine1的基本类型成员变量id;常量列表{0,0,0}用于初始化oLine1的struct Point类型成员变量StartPoint;常量列表{100,0,0}用于初始化oLine1的struct Point类型成员变量EndPoint。

数组,结构体初始化 {0}相关推荐

  1. 数组,结构体初始化 {0} (转载)

    一直以为 int a[256]={0};是把a的所有元素初始化为0,int a[256]={1};是把a所有的元素初始化为1. 调试的时查看内存发现不是那么一回事,翻了一下<The C++ Pr ...

  2. C++ 数组与结构体初始化列表

    1.数组与结构体初始化列表 #include <iostream> using namespace std; struct stu {     int a;     float b; }; ...

  3. c++ 结构体初始化_【干货】c语言基础语法——结构体

    1.关于C语言结构体的引入 学习环境搭建1_Linux C语言_嵌入式开发工程师-创客学院​www.makeru.com.cn 在实际问题中有时候我们需要几种数据类型一起来修饰某个变量. 例如一个学生 ...

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

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

  5. 关于结构体初始化的自我小结

    前段时间在一个项目中使用到结构体数组来存储产品不同型号的参数,使程序通用化,便于测试和快速生产.由于之前很少使用结构体数组,在初始化时遇到了一点小阻碍,于是便想到对于结构体和其数组的初始化操作做一个小 ...

  6. c语言结构体学习整理(结构体初始化,结构体指针)

    渣渣c的c语言学习之路 1.关于c语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char -等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用, ...

  7. C语言面试干货——指定结构体初始化器(GCC手册解析)

    文章目录 指定结构体初始化器(Designated Initializers) 背景 初始化struct 初始化union 对于重复初始化的说名 本人就职于国际知名终端厂商,负责modem芯片研发. ...

  8. C语言结构体初始化的几种方法

    一.介绍 结构体作为数据结构的基础,经常使用,其中初始化也有几种方法,这里详细介绍 二.常规初始化(先定义再初始化) typedef struct {int bandrate;int databits ...

  9. Go 学习笔记(33)— Go 自定义类型 type(自定义结构体、结构体初始化、结构体内嵌、自定义接口)

    1. 自定义类型格式 用户自定义类型使用关键字 type ,其语法格式是: type newType oldType oldType 可以是自定义类型.预声明类型.未命名类型中的任意一种. newTy ...

最新文章

  1. 常用样式积累-scss
  2. 华为首款搭载鸿蒙os 荣耀智慧屏,全球首款搭载鸿蒙OS终端! 荣耀智慧屏将在今天拉开面纱...
  3. 如何理解if __name__=='__main__'?
  4. JavaScript实现继承的方式
  5. 计算机云计算中心建设项目,某大学计算机云计算云数据中心建设方案.docx
  6. PMP考试备考指南基础知识
  7. 基于英雄联盟寻路背景的A星算法及python实现
  8. Kanzi学习-待继续更新
  9. 计算机二级必过知识点大全,计算机二级ms-office办公软件必过知识点.doc
  10. 云痕大数据 家长登录_云痕大数据平台的使用对初中英语教与学的作用
  11. 什么是lora无线通讯
  12. Fall 2011 CS193P Assignment 2: 可编程计算器答案
  13. barrier linux,Linux Barrier I/O 实现分析笔记
  14. inet_addr函数
  15. Mac上播放 swf 格式文件 小技巧
  16. HR员工管理的三重境界:管事、管人、管心
  17. MATLAB算法实战应用案例精讲-【回归算法】偏最小二乘回归(PLS)(附MATLAB、R语言和Python代码)
  18. 《袁老师访谈录》第21期《红鸟沙龙》第4期|刘通/折纸艺术家
  19. NTKO在线office控件使用实例
  20. 如何找到/etc/sysconfig/network-scripts/ifcfg-ens33.swp文件

热门文章

  1. 郑豪8.7黄金跳水下跌,下周还会延续跌势吗?黄金开盘思路最新操作建议
  2. 前端 什么是响应式设计
  3. 人月神话 中文版 pdf
  4. FPGA(一)Vivado与ModelSim
  5. matlab受力曲线导入adams中,如何在adams中导入dxf曲线
  6. 3ds Max 2014以及低版本在高分辨率带DPI缩放设置的应用程序设置
  7. Pareto最优解排序
  8. NPOI实现Word删除表格
  9. Java 实现连连看算法
  10. VIA和PAD的用法区分