文章目录
前言
C语言里自定义类型有3种,分别是结构体,枚举,联合
结构体
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体的声明
结构体的声明形式如下
struct tag//tag是标签名
{
member-list;//大括号里面是结构体成员
}variable-list;//大括号后面分号前是变量列表,可以在这里定义变量。注意最后的分号不能少
示例
struct Book
{
char name[30];
double price;
char author[30];
}book1;
在上面的例子中,Book是结构体标签,在这段代码之后我们可以用如下的命令来创建这种类型的结构体变量
struct Book book2;//struct Book是结构体类型,book2是结构体变量
匿名结构体
结构体的标签名是可以省略的,但这样这种结构体就只能在大括号后面直接定义变量。
示例
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;//这里a是结构体数组,p是结构体指针
由于匿名结构体没有标签,我们无法像前面的例子一样用
struct+标签+变量名;
这样的方式创建变量,所以我们一般不用匿名结构体。
使用结构体时的两个易错点
易错点1
这里再举一个关于匿名结构体的错误示范
struct
{
int a;
char b;
double c;
}s;
struct
{
int a;
char b;
double c;
}*ps;
ps=&s;
这样的代码是有问题的,看起来ps指向的类型和s的类型是同一种类型,但是编译器会把他们认为是两种不同的结构体类型,虽然会得出想要的结果,但是编译器会提出警告。
易错点2
结构体声明知识创建了一种类型,并没有实际分配空间。
#include<stdio.h>
#include<string.h>
struct BOOK
{
float price;
char name[30];
}*ps;
int main()
{
ps->price = 88.9f;
//ps->name = "C primer plus";//注意字符串拷贝不能用等号!
strcpy(ps->name, "C primer plus");
printf("%f\n", ps->price);
printf("%s\n", ps->name);
return 0;
}
大家可以自行尝试运行如上代码,程序会挂掉
正确的写法应该是下面这样
#include<stdio.h>
#include<string.h>
struct BOOK
{
float price;
char name[30];
}*ps,s;
int main()
{