目录
总结
![](https://i-blog.csdnimg.cn/blog_migrate/3ef9c41343d58386e7fadd80af6a8826.png)
前言
C语言提供了一些定义好的数据类型,如:int,float,char 等,用户可以用它解决一般的问题,但人们总会遇到些很复杂的问题,系统提供的已无法满足要求,这时C语言就很人性化的允许用户自己建立自己的数据类型并用它们来定义变量解决问题。
一、定义并正确的使用结构体
1.1建立结构体类型
在建立结构体类型前我们先来了解一下什么是结构体,在我们平时写代码中会经常遇到需要定义多个数据类型的情况,它们大多数都是相互独立的,无内在联系,例如定义了整形变量 a,b,c;字符型变量 d,c,b;,它们都是单独存在的变量,在内存中地址也是互不相干。在现实生活中有些数据是相互联系的,例如一个学生的姓名(name),学号(num),年龄(age),性别(sex),而如果用分别定义的办法则难以反映出它们内在的联系。
name | num | age | sex |
Zhou Huan Huan | 250250 | 18 | W |
于是C语言允许用户自己建立一个由不同数据类型组合而成的组合型的数据结构,除了可以储存相同的数据类型外还可以储存不同的数据类型,它成为“结构体”(structre)。在一些高级的程序语言中成为“记录”(record)。如下:
struct Student///Student是结构体名,由用户自己定义
{ char name;///名字为字符串
int num;///学号为整型
int age;///年龄为整型
char sex;///性别为字符串
}; ///结尾大括号完后要加上分号
这就是由程序设计者自己建立的结构体类型(struct Student),struct是关键字不能省略。大括号内的是结构体所包含的子项,称为结构体的成员(member)。所有的成员组起来就是”成员列表“也成为”域表“,每一个成员都是结构体的一个域。
![](https://i-blog.csdnimg.cn/blog_migrate/e75adea733f5fefb9706bfe21c3cca75.png)
*有了以上的了解相信大家已经可以自己建立属于自己的结构体类型,根据自己的需要来建立出各种各样的结构体类型和结构体的成员。
1.2定义结构体类型变量
上面只是建立了结构体的类型,相当于建好了一个房屋,但是里面还没有家具。为了在程序中使用结构体类型的数据,我们需要定义结构体的变量,并存放具体的数据。有三种方法可以定义结构体的变量。
(一) 先声明后定义
这种定义形式和其他类型的变量形式是很像的(如int a,b;)。如下所示:
struct Student///Student是结构体名
{ char name;///名字
int num;///学号
int age;///年龄
char sex;///性别
}; ///结尾记得加上分号
int main()
{
struct Student S1;///S1是我们自定义的变量名和int a,b;类似
struct Student S2;///S2是我们自定义的变量名和int a,b;类似
return 0;
}
在定义了结构体变量后,系统会自动为结构体类型中的成员情况分配内存。
这种方式的声明和定义分离而开,在声明类型后也可以随时定义变量,比较灵活。
(二) 声明的同时定义变量
这种方法与第一种方法的作用相同,这种定义的具体方法如下:
struct Student///Student是结构体名
{ char name;///名字
int num;///学号
int age;///年龄
char sex;///性别
} S1 , S2; ///直接在大括号的末尾进行定义
struct 结构体成员名
{
成员列表
} 变量名;
这种方法把声明类型和定义放在了一起同时进行,比较直观,但在写大程序有大量代码时不建议用这种方法,推荐用第一种方法把类型和定义分开放着,这样的程序结构清晰,便于维护。
(三)不指定类型名直接定义结构体变量(匿名结构体)
这种类型会指定一个无名的结构体类型,它没有结构体名字,其一般形式为:
struct ///没有结构体名
{ char name;///名字
int num;///学号
int age;///年龄
char sex;///性别
} S1 , S2; ///结尾记得加上分号
struct
{
成员列表
}变量名;
这种方法的弊端也显而易见,因为没有结构体名,所以不能以此结构体类型再去定义其他变量,整个程序中只允许使用一次,所以这种方法用的不多 。
以上就是三种定义结构体变量的方法,有几点需要我们注意一下:
① 结构体类型和结构体变量是不同的概念,不要混淆,在编译时对类型不分配空间,只对变量分配空间。
② 结构体类型中的成员名和程序中的变量名可以相同,但二者代表的对象不同。
③ 对结构体的变量的成员可以单独使用,它们的作用相当于普通变量。使用方法详见1.3。
1.3结构体变量的初始化和引用
在定义完结构体变量后我们就可以对它初始化,赋予它初始值,然后就可以引用这个变量输出成员的值。
举个例子:把一个学生的姓名,学号,年龄,性别放到一个结构体变量中,然后输出这个学生的信息。首先我们需要建立一个结构体类型和有关学生信息的成员,然后用它们来定义结构体变量同时赋予学生的信息(初始值),最后再把所有信息输出所有成员的信息。如下:
struct Student///Student是结构体名
{ char name;///名字
int num;///学号
int age;///年龄
char sex;///性别
}; ///结尾记得加上分号
int main()
{
///要按照结构体成员从上至下的顺序进行初始化
struct Student S1 = {“ZhouHuanHuan”,250250,18,'W'};
///定义了结构体变量S1并进行了初始化
printf("name:%S num:%d age:%d sex:%c",S1.name,S1.num,S1.age,S1.sex);
/// S1.name表示变量S1中的 name 成员,同理num,age,sex。
return 0;
}
需要注意的是S1后面的大括号内对成员的赋值要按照结构体内部从上至下的顺序进行赋值,而输出的时候可以不用按照顺序来进行输出,可以通过 (结构体变量名.成员名) 来引用成员并对指定成员进行输出,还有要注意的是对结构体变量的初始化并不是对结构体类型的初始化 。
如果有结构体内的成员未被初始化赋值则会被系统自动初始化为0,字符为'\0',指针类为NULL。
![](https://i-blog.csdnimg.cn/blog_migrate/c8d2639550c28c43ecc39d0f24ac97d4.png)
* 以上就是结构体变量的初始化和引用,还有一个需要注意的点是不能通过输出结构体变量名来一次性输出所有成员值,这种做法是错误的,如下:
struct Student S1 = {“ZhouHuanHuan”,250250,18,'W'};
printf("%s",S);
二、结构体数组的使用
2.1结构体数组的定义
一个结构体变量中可以存放一组有关联的数据,但如果10有个相同类型的数据参与运算,这时候就需要用上结构体数组,结构体数据与数值型数据不同处在于每个数组元素都是一个结构体类型的数据,它们分别包括了各个成员。一般形式如下:
struct Student///Student是结构体名
{
char name;///名字
int age;///年龄
}; ///结尾记得加上分号
int main()
{
struct Student fp[3] = {“Zhangsan”,18,"LiSi",19,"WangWu",20};
///定义结构体数组并初始化
结构体类型 结构体数组名[长度];
return 0;
}
主程序中结构体变量fp里的大括号里内容的意思为将 “ZhangSan”赋给fp[0].name,将10赋给fp[0].age; 将"LiSi"赋给fp[1].name,将19赋给fp[1].age;后面的 wangwu 和 20 同理。
如果要对结构体数组内容进行输出也很简单上面我们讲过的输出方法很像,如下:
printf("name:%s age:%d ",fp[0].name,fp[0].age);
只是把前面的变量名换成了数组变量名和长度
额外补充:结构体内部可以引用另一个结构体,也就是结构体的嵌套 ,如下:
struct Student2
{
int month;
int year;
int day;
};
struct Student///Student是结构体名
{
char name;///名字
int age;///年龄
struct Student2 birthday;///成员birthday属于struct Student2类型
}; ///结尾记得加上分号
有了这样的扩展,就可以根据需要在结构体内部建立各种结构体类型了。
![](https://i-blog.csdnimg.cn/blog_migrate/71b37f2ad03f848bfa89926d8af72169.png)
*以上就是结构体数组的定义和引用,并不难理解 ,相信大家看几遍也就明白了,也没有什么需要特别注意的点,硬要说的话注意一下编写时的美观程度。
![](https://i-blog.csdnimg.cn/blog_migrate/d8b4144c0591c1be72816c32f15c1faf.png)
总结
*有了这些了解,相信大家已经对如何建立结构体并使用有了大概的了解,不妨趁热打铁上号练几个代码,熟悉熟悉。