在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理。
结构体定义
要使用结构体时,首先要进行结构体的声明。声明的形式如下:
struct 结构体名{
结构体所包含的变量
};
比如现在要描述一本书的标题,作者,价格。声明格式如下:
struct book{
char title[30];
char author[30];
float value;
};
用字符数组来存储书的标题和作者,用浮点型来存储书的价格。声明完成之后,此时在内存中并没有分配存储空间。因为结构体也是一种数据类型,它和char、int、float等类型一样属于数据类型。
声明完结构体之后,就告诉了计算机,我要使用的数据类型是结构体类型。在后面操作这个对象的时候,就按照结构体的方式来操作。此时就相当于只写了一个 int ,并没有定义变量。
下面开始定义结构变量。
struct book b1;
此时就在内存中创建了一个结构类型的变量b1,系统就会在内存中给b1分配一个存储空间。
在上面将结构体的声明和变量的定义分成了两部分,也可以使用一起实现。
struct book{
char title[30];
char author[30];
float value;
} b1;
用这种方式就可以声明一个结构类型,同时定义了一个结构变量b1。如果还想在定义一个变量b2,可以在初始化的时候定义。也可以单独定义。
单独定义:
struct book b2;
在声明的时候时候定义
struct book{
char title[30];
char author[30];
float value;
} b1,b2;
如果这个结构体不需要再定义其他的变量,那么在声明时可以省略结构体名,比如上面的代码就可以简写为:
struct {
char title[30];
char author[30];
float value;
} b1,b2;
将结构体名book直接省略掉,但是这样的话,以后如果再想单独定义一个变量b3就不能实现了。
结构体初始化
方法一:
初始化上面定义的两个变量,在定义的时候直接初始化。
struct book{
char title[30];
char author[30];
float value;
};
struct book b1 = {"语文","张三",19.8};
struct book b2 = {"数学","李四",21.3};
初始化的时候,各个项之间用逗号隔开,按照定义时的顺序,依次填入各个成员的值。
方法二:
可以每个成员单独初始化
struct book{
char *title;
char *author;
float value;
} b1,b2;
b1.value = 19.8;
b1.title = "语文";
b1.author = "张三";
b2.title = "数学";
b2.value = 21.3;
b2.author = "李四";
定义好变量之后,给每个成员单独初始化,初始化的时候可以不按照顺序来。在单独初始化的时候,这里要注意一下,需要将结构体声明中的的字符数组改为指针。如果还是用字符数组,那么在给数组赋值的时候,只能使用下标,一位一位的给数组中每个元素赋值。而不能将数组定义好之后,然后给数组的首地址一个字符串。字符数组只有在定义的时候,可以直接用字符串赋值。如下所示:
char str[30] = "123"; //正确
char str1[30];
str1 = "abc"; //错误
如果需要给成员单独初始化,就需要将申明中的数组改为指针,如果不想修改的话,那么也可以在定义的时候,直接初始化。
方法三:
在初始化的时候,可以直接使用结构成员运算符—点(.)访问结构体中的成员。这样的话就可以直接指定要向哪个成员赋值。可以不按照顺序来对成员进行赋值。
struct book{
char title[30];
char author[30];
float value;
} ;
struct book b1={
.value = 19.8,
.title = "语文",
.author = "张三"
};
struct book b2={
.title = "数学",
.value = 21.3,
.author = "李四"
};
在操作结构体中的对象时,也可以使用点来访问。比如需要打印结构成员的信息时,可以使用下面 的代码:
printf("%s %s %f\r\n",b1.author,b1.title,b1.value);
printf("%s %s %f\r\n",b2.author,b2.title,b2.value);
在结构体变量后加一个点就可以直接访问变量中的具体成员。成员的操作方法和它对应的类型操作方法一样。