问题:学籍管理,记录下每个学生的姓名、学号、性别、年龄、分数、地址,
你也许会定义姓名为char型变量、学号为int型变量、性别为char型变量……但是这些变量都是相互独立的,无法将它们联系起来,那怎么样能把这些数据存放在一起呢?
而C语言,允许用户自己建立不同数据类型组合而成的结构型数据,而这个结构型数据称为结构体。组成结构型数据的各个数据,称为结构体的成员。
通俗来说:结构体就是用户自己定义的数据结构,允许用户在里面存储不同的数据类型。
声明结构体的一般形式:
struct 结构体名
{
成员表列
};
注意:最后有一个分号
对上述学籍管理的问题,声明一个结构体
struct student //结构体类型名为student
{
char nam[20];//姓名定义为字符串变量
int num;//学号定义为整型变量
char sex;//性别定义为字符变量
float score;//分数定义为实型变量
char address[30];//地址定义为字符串变量
};
1.先声明结构体类型,再定义该类型的变量
如上面的程序已经定义了结构体类型名,就可以用它来定义变量。
例如:
struct student student1,student2;结构体变量名为student1和student2
声明结构体类型就是为了后续定义结构体类型变量时,让系统对之分配存储单元。
声明结构体类型就相当于建造一个房子的大框架,定义结构体变量就相当于在房子里摆物件。
根据成员的数据类型,32位的系统会为student1分配一个63个字节的存储单元(20+4+1+8+30=63)。
2.在声明类型的同时定义变量
例如:
struct student
{
char nam[20];
int num;
char sex;
float score;
char address[30];
}student1,student2;
这种定义方法的一般形式:
struct 结构体名
{成员表列
}变量名表列;
这种方法适合用于写小程序,能直观地看见结构体的结构;但在写大程序时,往往要求对结构类型的声明和对变量的定义分开,声明完类型,可以随时定义变量,便于后续维护。
例如:
struct student
{ int num;
char nam[20];
char sex;
float score;
char address[30];
}student1 = { 10101, "Lihua",'M', 99, "101 Xinhua Road"};
在变量名后的花括号中提供各个成员的值,将10101, "Lihua",'M', 99, "101 Xinhua Road"按顺序分别赋给student1变量中的num,nam[20],sex,score,address[30]
结构体变量名.成员名
例如:student1.num表示student1变量中的num成员。
在程序中,在定义完结构体变量后,再对结构体成员逐一初始化,例如:
struct student stud1;
stud1.num = 10101;
strcpy(stud1.name, "Li si");
stud1.sex = 'M';
stud1.score = 99;
strcpy(stud1.address, "1 Haida Road") ;
printf("%d,%s,%c,%f,%s\n", stud1.num, stud1.name, stud1.sex, stud1.score, stud1.address);
注意:要给字符数组赋值是不能直接赋值的,需要用strcpy函数。
" . "是成员运算符,它在所有的运算符的优先级最高,所以student1.num可以看作是一个整体。
注意:不能通过结构体变量名来输出结构体变量全部成员的值。
printf("%s\n",student1); //error
只能对结构体变量中的各个成员分别进行输入或输出。
例如:
struct student1 = {
.name = "Lisi",
.score = 95
};