1.结构体概念
2. 结构体声明
3. 结构体定义
5. 结构体变量成员的引用
6. 结构体变量的赋值
7. 结构体变量的初始化
8. 结构体的嵌套
C语言中引入了一种构造出句类型成为结构体,他是由若干个成员构成,成员本身可以是基本数据类型,也可以是其他构造类型,他相当与高级语言中的记录,类似与java高级语言中的实体类。可以表示一些复杂的数据类型;类似:
struct student{
char *name;
int age;
int num;
float weight;
};
结构体在使用之前,需要先声明结构体
声明的语法:
struct 结构体名称
{
类型说明符号 成员名;//成员列表
};
成员表有若干个成员组成,每个成员都是该结构体的一部分,对每个成员必须做出类型说明,成员可以是基本数据类型,也可以是构造数据类型;
注意:
语法1:预先已声明结构体
struct 结构体名 变量1,变量2,...变量n;
语法2:声明结构体的时候同时定义结构体变量
struct 结构体名{
成员列表;
} 变量名1,变量名2...变量n;
语法3:直接定义结构体变量
struct {
成员列表;
}变量名1,...,变量名n;
注意:结构体变量的定义尽量不要在头文件中,声明结构体的时候放在头文件中,结构体和结构体变量就类似与java中的类和对象之间的关系。
C语言中不允许对结构体变量整体进行输入和输出的,对结构体变量的操作都是对结构体变量成员进行操作的。是个体关系,不能整体操作
引用方式:
结构体变量.成员名
机构体变量成员通过"."来引用
如果成员本身就是属于一个结构体类型的话,那么此时就继续用若干个点运算符号,一级一级的找,直到找到自己操作的那个
class.student.name = "zhangsan";
我们可以引用结构体变量成员的地址,也可以引用结构体变量的地址
初始化方法1:
结构体变量的赋值,就是对结构体变量的各个成员进行赋值
如:student.xh = 100;
student.name = "hello";
可以用输入语句来进行赋值:
scanf("%s %f",&student.sex,&student.score);
允许具有相同类型的结构体变量进行相互赋值:
student1 = student2;
注意:结构体中成员变量如果是字符数组的话,不能进行赋值,但是可以使用strcpy进行拷贝,如果是字符指针的话,可以直接进行赋值,所以在操作过程中我们尽量使用字符指针来进行操作;
注意:数组名本来就是地址,所以在赋值的时候,不需要加&符号:
char gender[30];
如:scanf("%s",gender);
没有进行赋值初始化的时候,由于结构体变量是局部变量,因此存储在栈中,其初始的值是随机数值;其占用的字节数等于它成员变量占用的总的字节数,成员越多,其占用的字节数也就越多
初始化方法2:
预先已声明结构体再定义结构体变量并初始化:
struct 结构体名 变量名1 = {成员值类表},...,
变量名n = {成员值列表};
初始化方法3:
声明结构体的同时定义结构体变量并且初始化:
struct 结构体名{
成员变量;
}变量名1 = {成员数值列表},变量名2 = {成员数值列表},...,变量名n ={成员值列表};
初始化方式4:
直接定义结构体变量并且初始化
strcut {
成员列表;
}变量名1={成员值列表},...,变量名n={成员值列表};
可以将一个结构体放入另外一个结构体内,但是结构体不能嵌套它自身,如果嵌套自身的话,就必须是结构体指针类型
struct address{
char country[20];
char city[20];
}
struct student{
int xh;
char name[20];
struct address addr;
};
要访问结构体address中的成员,而address是另外一个结构体student的成员,可以通过点运算符的链式方式访问
如:访问成员country: stu.addr.country
访问city:stu.addr.city;
下面通过代码来完整的展示下结构体的玩法:
#ifndef __TEACHER_H_
#define __TEACHER_H_
/*定义一个街道结构体,成员变量为国家,城市,和街道*/
struct address{
char *country;
char *city;
char *street;
};
/*定义一个teacher结构体,成员变量为编号,年龄,姓名,工龄,地址*/
struct teacher{
int num;
int age;
char *name;
int teach_year;
struct address addr;
};
#endif
源文件代码
#include
#include
#include"teacher.h"
#include
struct score{
int math_score;
int chinese_score;
int english_score;
};
/*定义一个学生类型*/
struct student{
int xh;//
char *name;
int class;
struct address addr;
struct score all_score;
}zzf ={1,"zzf",3,{"china","shanghai","yindu_road"},{80,85,90}};//声明的时候直接去定义一个学生zzf,并且初始化。
//打印出学生的信息
void printfStudentInfo(struct student stu);
void printfTeacherInfo(struct teacher tea);
int main(int argc,char *argv[]){
printfStudentInfo(zzf);
printf("==========================\n");
//定义的时候初始化
struct teacher teacher_zhang = {1,50,"zhang",5,{"china","minhang","yizhong"}};
printfTeacherInfo(teacher_zhang);
printf("===============================\n");
//先定义后初始化
struct teacher teacher_wang;
teacher_wang.num = 2;
teacher_wang.age = 40;
teacher_wang.name = "wang";
teacher_wang.teach_year = 10;
teacher_wang.addr.country = "china";
teacher_wang.addr.city = "shanghai";
teacher_wang.addr.street ="chunshen_road";
printfTeacherInfo(teacher_wang);
printf("=============相同结构体名变量jiegouti赋值======\n");
struct teacher teacher_other;
teacher_other = teacher_wang;
printfTeacherInfo(teacher_wang);
printf("==============================");
//不去定义结构体名,然后直接定义结构体变量
struct{
char book_name[20];
int pages;
int charpter_nums;
}math_book;
//如果使用字符数组的话,就必须使用strcpy才能赋值
strcpy(math_book.book_name,"jihe");
math_book.pages = 150;
math_book.charpter_nums = 12;
printf("book name:%s,book pages:;%d,book charpter_nums:%d\n",math_book.book_name,math_book.pages,math_book.charpter_nums);
return 0;
}
void printfStudentInfo(struct student stu){
printf("stu xh:%d\n",stu.xh);
printf("stu name:%s\n",stu.name);
printf("stu class:%d\n",stu.class);
printf("student country:%s,city:%s,street:%s\n",stu.addr.country,stu.addr.city,stu.addr.street);
printf("student math:%d,chinese:%d,english:%d\n",stu.all_score.math_score,stu.all_score.chinese_score,stu.all_score.english_score);
}
void printfTeacherInfo(struct teacher tea){
printf("teacher num:%d\n",tea.num);
printf("teacher age:%d\n",tea.age);
printf("teacher name:%s\n",tea.name);
printf("teacher teacher_year:%d\n",tea.teach_year);
printf("teacher country:%s,city:%s,street:%s\n",tea.addr.country,tea.addr.city,tea.addr.street);
}
代码是可以直接进行run的,谢谢大家观看。本人是一个新C的Coder,持续更新中,有什么疑问或者错误的地方,请看官们及时指出,谢谢大家