数组,结构体初始化为0
一直以为 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。
最后,总结下结构体初始化常用的2种方法
//
struct{
//...
int a;
int *p;
}x;
memset(&x, 0, sizeof(x))
或者
memset(&x, 0, sizeof(struct A_stru))
这是结构体变量初始化为0的常见方法,需要注意x前的&号。
///
struct A a = {0};
数组,结构体初始化为0相关推荐
- C语言高级编程:数组和结构体初始化为0的方法
测试平台:64位 X86 Ubuntu 1. 代码: #include <stdio.h> #include <memory.h>struct st_stu {char *na ...
- c语言中结构体变量怎么初始化为0,C语言高级编程:数组和结构体初始化为0的方法...
测试平台:64位 X86 Ubuntu 1. 代码: #include #include struct st_stu { char *name; int age; int class; }; void ...
- 二维数组所有元素初始化为0
一.初始化:char a[3][3]={0}; 二. 1.char a[3][3]; 2.memset(a,0,sizeof(a)); 三.如果是动态分配内存方式构建数组的话,把mal ...
- C# 将结构体转化为byte数组,byte数组转化为结构体
1.将结构体转化为byte数组 #region /// <summary>/// 结构体转为byte数组/// </summary>/// <typeparam nam ...
- c语言定义数组变量初始化为0,c语言数组初始化——int a[N] = {0};
初学数组,以华科的<c 语言与程序设计>为教材,参考了<一站式学习c编程>,后者数组一章有串代码如下 int main(void) { int i, histogram[10] ...
- c语言如何初始化程序,c语言二维数组如何初始化为0 - 全文
c语言二维数组如何初始化 1 有两种方法 (1)在定义时可以直接赋值来初始化 (2)在定义后可以为其元素一个个来赋值 2 示例 123456789101112131415161718192021222 ...
- 结构体数组(SoA)与数组结构体(AoS)
1.结构体数组(SoA) /** SoA 结构体数组定义*/ struct InnerArray {float x[LEN];float y[LEN]; }; /** CPU -> SoA 结构 ...
- C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例
C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...
- c如何将数组初始化为0?
转载自:http://www.cnblogs.com/programnote/p/4719078.html 如何将数组初始化为全0? C语言中,声明数组的语句: int arr[100]; 这样声明得 ...
最新文章
- Burpsuite+SQLMAP绕过Token保护(Burpsuite Macros应用)
- mysql中char,varchar,text
- VUE工程跨域的配置
- Python爬虫基础:简单的爬虫入门示例(urllib库)
- 【转】XMPP_3920_最靠谱的中文翻译文档
- Oracle版本号的含义
- ASP.NET操作简单的xml,增删改查
- python绘制汉字_OpenCV Python 绘制中文字
- 纯java生成验证码 java生成图片并保存
- java获取专辑封面_从MP3中读取专辑封面图片
- phpcms上线步骤,无法生成缓存,页面空白原因
- 收藏 | 90+深度学习开源数据集整理:包括目标检测、工业缺陷、图像分割等多个方向(附下载)...
- 好用的轻量级http接口测试工具(替代PostMan)
- 程序员教你玩转电脑手机
- 开通支付宝小程序收款功能
- 动漫Hello World
- ZT I Believe I Can Fly(我相信我能飞)
- 编程思想 之「泛型」
- 新一轮产业革命和行业转型加快,行业人才需求显著增加
- 小白福音——VBA编程常用——命令三百例
热门文章
- 2021年春季学期-信号与系统-第三次作业参考答案-第六道题
- 机械臂底层通信协议说明
- 使用示波器测量扬声器的阻抗实验数据
- 砂石到芯片转变旅程:一千多道工序,数百英里
- c语言printf输出格式顶格,c语言printf()输出格式[共6页].pdf
- Java状态模式实现工作流_关于使用“状态模式”做工作流概要。
- java 投票ip限制_java 限定网站在指定IP段访问
- vbs字符串正则_VBscript中的正则表达式
- android 拖动数字选择,拖放android 3.x导致illegalStateException之后的小数字拖动
- html Qestionnaire表单