注:结构体类型的名字是由一个关键字struct和结构体名组合而成的(例如struct Student)。结构体名是由用户指定的,又称“结构体标记”,以区别于其他结构体类型。上面的结构体声明中Student就是结构体名(结构体标记)
说明
struct 结构体名
{成员列表}
类型名 成员名;
“成员列表”也称为“域表”
struct Student { int num; char name[20]; char sex; int age; float score; }
注:
student1 = student2
scanf("%d",&student1.num); printf("%o",&student1);
声明结构体类型
sturct Student student1,student2;
定义结构体
student1.num = 10001; student1.name = "zhangxin"; //此处如此赋值是不正确的,请自行百度如何正确赋值char数组。 student1.sex = "M"; student1.age = 19; student1.score = 90.5; student2.num = 10002; student2.name = "wangli"; //此处如此赋值是不正确的,请自行百度如何正确赋值char数组。 student2.sex = "F"; student2.age = 20; student2.score = 98;
struct Student { int num; char name[20]; char sex; int age; float score; }student1,student2;
注:该定义方法的一般形式为
struct 结构体名 {成员列表 }变量名列表;
struct {成员表列 }变量名表列;
说明:
【例9.1】把一个学生的信息(包括学号、姓名、性别)放到同一个结构体变量中,并输出这个学生的信息
#include<stdio.h> int main() { struct Student { int num; char name[20]; char sex; int age; // float score; }a={10101,"Li Lin",'M'}; printf("学号:%d,姓名:%d,性别:%d。\n",a.num,a.name,a.sex,a.age); return 0; }
struct Person { char name[20]; int count; }leader[3];
struct Person leader[3];
定义结构体数组
【例9.3】有三个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先输入被选人的名字,最后输出各人得票结果。
#include<string.h> #include<stdio.h> struct Person() { char name[30]; int count; }leader[3]={"Li",0,"zhang",0,"sun",0}; int main() { int i,j; char leader_name[20]; for(i=1;i<=10;i++) { scanf("%s",leader_name); for(j=0;j<3;j++) { if(strcmp(leader_name,leader[j].name==0)) leader[j].count++; } } printf("\nResult:\n"); for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count); return 0; }
struct Student *pt
【例9.5】通过指向结构体变量的指针变量输出结构体变量中的成员信息
#include<stdio.h> #include<string.h> int main() { struct Student { long num; char name[20]; char sex; float score; }; struct Student stu_1; return 0; }
注:以下三种等价
【例9.6】有3个学生的信息,放在结构体数组中,要求输出全部学生的信息
#include<stdio.h> struct Student { int num; char name[20]; char sex; int age; }; struct Student stu[3]={{10101,"Li",'M',18}, {10102,"zhangfang",'M',19},{10104,"wangmin",'F',20}}; int main() { struct Student *p; printf("No. Name sex age\n"); for(p=stu;p<stu+3;p++>) { printf("%5d %-20s %2c %4d\n",p->num,p->name,p->sex,p->age); } return 0; }
注:
p = stu[1].name;//不合法,stu[1].name是stu[1]元素中成员name首字符的地址。编译时将会给出“警告”信息,表示地址的类型不匹配。
p = (struct Student*) stu[0].name;
此时,p的值是stu[0].name成员的起始地址。但是p仍然保留原来的类型。如果执行printf("%s",p+1);,则会输出stu[1]中name的值。执行p++时,p的值的增量是结构体struct Student的长度。struct Student { int num; char name[20]; float score[3]; float aver; }
void input(struct Student stu);
void input(struct Student stu[]);
注:C程序设计 谭浩强版此处有9.4节“用指针处理链表”本人将其归类到了第八章指针中
格式:
union 共用体名
{成员表列}变量表列;
例如
union Data { int i; char ch; float f; }a,b,c;
注:结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长成员的长度。
a.i a.ch a.f
union Date { int i; char ch; float f; }a; a.i = 97; printf("%d",a.i); //输出97 printf("%c",a.ch); //输出a printf("%f",a.f); //输出实数0.00000注:整型无法用浮点型的格式输出,故
printf("%f",a.f);
输出为0union Date { int i; char ch; float f; }a = {1,‘a’,1.5}; //此处错误
a = 1; m = a;
struct { char name[20]; char sex; char job; union { int class; char position[10]; }category; }person[2];
注:枚举类型放在了第3章“顺序程序设计”
注:typedef声明新类型名放在了第3章“顺序程序设计”