结构体的初始化


结构体的初始化

在结构体外面:定义变量同时可以初始化。 形式如下:
1.变量的初始化:数据类型 变量名=初始化值;
例如,定义整型变量a,并给其初始化值10的语句如下int a=10;
2.数组的初始化,需要通过一常量数据列表,对其数组元素分别进行初始化,形式如下:
数据类型 数组名称〔数组长度〕={初始化值1,初始化值2,…, 初始化值n};
例如,定义长度为5的整型数组,并对其初始化 :int arr[5]={20,21,0,3,4};

但是在定义结构体时不可直接在里面初始化,为什么:

C语言中不允许这么做,结构体外面定义的变量, 不管是局部变量还是全局变量,编译器都要立即给他分配空间。分配了空间之后明确的知道这个变量的位置,初始化就是初始化那块儿内存 。 在结构体里面, 结构体本身的定义并不分配内存,只是声明了一个类型而已,只有定义结构体变量时才会分配内存,所以在里面的初始化语句并不是在编译结构体定义时起作用,而是要等到用结构体定义变量时才起作用
C++中也不允许直接初始化,而是用一个函数来完成你要的初始化工作
后来到C++11,可能是为了方便程序员,标准也开始支持这种类内直接初始化了

如何对结构体初始化:

对结构体初始化需要另写一个结构体初始化函数或通以下三个方法

方一:先定义结构体类型再定义变量
struct 结构体标识符
{
成员变量列表;

};
struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };

例如:
struct student
{
int ID;
char name[10];
float score;
}

int main()
{
//定义结构体类型后赋值
struct student zhang;
strcpy(s1.name,"s1");
s1.SID=1;
s1.score=89;
}

方二:定义类型同时定义变量

struct Point
{
double x;
double y;
double z;
} P1={0.0,0.2,0.3};

方三:直接定义变量名,无结构体名

struct //无结构体名
{
成员列表;
}变量名;

struct
{
int a;
double y;
int z;
} P1={5,0.2, 3};

在初始化结构体变量时候,既可以初始化其全部成员变量,也可以仅仅对其中部分的成员变量进行初始化。其他没有初始化的成员变量由系统完成初始化,为其提供缺省的初始化值。例如:
struct Student
{
long id;
char name[20];
char sex;
}a= {0};
其相当于a.id=0;a.name=“”;a.sex=‘\0x0’。