C语言结构体基本知识
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结构体类型定义描述结构 的组织形式,不分配内存
• .2 结构体变量的定义
– 先定义结构体类型,再定义结构体变量
• 一般形式:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; 例 ……………. #define STUDENT struct student }; STUDENT struct 结构体名 num; { int 变量名表列;
– 形式二:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }结构体变量={初始数据};
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”
num
2字节
…
name
20字节 1字节 2字节 4字节
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };
sex age score
…..
addr
wk.baidu.com
30字节
结构体类型定义的作用域
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu1,stu2;
char name[20]; char sex; int age; float score; char addr[30]; }; STUDENT stu1,stu2;
• 4 结构体变量的初始化
– 形式一:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }; struct 结构体名 结构体变量={初始数据};
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road
– 形式三:
struct { 类型标识符 成员名; 类型标识符 成员名; ……………. }结构体变量={初始数据};
例 struct { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”
全部初始化时维数可省
例 统计后选人选票
struct person name { char name[20]; Li int count; }leader[3]={“Li”,0,“Zhang”,0,”Wang“,0}; Zhang main() Wang { 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++; } for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count); }
– 定义结构体类型的同时定义结构体变量
一般形式:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列;
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
结构体与共用体
• 1 结构体
结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体------自定义数据类型 – 结构体类型定义
合法标识符 可省:无名结构体 成员类型可以是 基本型或构造型
struct [结构体名] { 类型标识符 成员名; 类型标识符 成员名; ……………. };
struct是关键字, 不能省略
– 指向结构体数组的指针
例 指向结构体数组的指针 struct student p num { int num; name char name[20]; sex char sex; age p+1 int age; }stu[3]={{10101,"Li Lin",'M',18}, {10102,"Zhang Fun",'M',19}, {10104,"Wang Min",'F',20}}; main() { struct student *p; for(p=stu;p<stu+3;p++) printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age); }
• .3 结构体变量的引用
– 引用规则
• 结构体变量不能整体引用,只能引用变量成员
引用方式: 结构体变量名.成员名
例 struct 成员(分量)运算符 student • 可以将一个结构体变量赋值给另一个结构体变量 例 struct student { stu1.num=10; int num; 优先级: • 结构体嵌套时逐级引用 1 { int num; 例 struct student 结合性:从左向右 { char name[20]; int num; 例 struct name[20]; char sex; char student char name[20]; stu1.score=85.5; 例 structchar num; student { int sex; int char sex; age; printf(“%d,%s,%c,%d,%f,%s\n”,stu1); () if(stu1==stu2) { int age; num; stu1.birthday.month=12; char name[20]; float score; int …….. () stu1.score+=stu2.score; char score; name[20]; int age; struct float date char addr[30]; stu1.age++; float score; char addr[30]; stu1={101,“Wan Lin”,‘M’,19,87.5,“DaLian” sex; { int char month; }stu1,stu2; addr[30]; char birthday int age; int }stu1,stu2; day; num name float score; }stu1,stu2; month day year int year; stu2=stu1; ( ) char addr[30]; }birthday; }stu1,stu2; }stu1,stu2;
• 5 结构体数组
– 结构体数组的定义
三种形式: 形式一: struct student 形式二: { int num; struct student 形式三: char name[20]; { int num; struct char sex; char name[20]; { int num; int sex; charage; }; char name[20]; int age; char sex; struct student stu[2]; }stu[2]; int age; }stu[2];
– 说明
• 结构体类型与结构体变量概念不同
– 类型:不分配内存; – 类型:不能赋值、存取、运算; 变量:分配内存 变量:可以
• 结构体可嵌套 • 结构体成员名与程序中变量名可相同,不会混淆 例 struct结构体类型及变量的作用域与生存期 • date { 例 struct student int month; { int num; int day; int char name[20]; year; struct date }; birthday struct { int month; student num name birthday int day; year num namemonth day { int num; month day year int year; char name[20]; }birthday; struct date birthday; }stu;}stu;
– 直接定义结构体变量
一般形式:
struct { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列; 用无名结构体直接定义 变量只能一次
例 struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
count 0
0 0
• 6 结构体和指针
main() – 指向结构体变量的指针 { struct student • 定义形式:struct 结构体名 *结构体指针名; { 例 struct student *p; long int num; char name[20]; • 使用结构体指针变量引用成员形式 struct student 存放结构体变量在内存的起始地址 char sex; p num { score; float int num; (*结构体指针名).成员名 结构体指针名->成员名 例 int n; struct student 结构体变量名.成员名 namestu1; char name[20]; }stu_1,*p; stu int *p=&n; struct student sex *p=&stu1; 例 p=&stu_1;char sex; 指向结构体的指针变量 *p=10; 指向运算符 stu1.num=101; age (*p).num=101 n=10 int age; stu_1.num=89101; }stu; 优先级: 1 strcpy(stu_1.name,"Li Lin"); 结合方向:从左向右 struct student *p=&stu; p->sex='M'; p->score=89.5; printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n", (*p).num,p->name,stu_1.sex,p->score); }
num
25B
name sex age num
name sex age
stu[0]
stu[1]
– 结构体数组初始化
分行初始化: – 结构体数组引用 顺序初始化: struct student struct student 引用方式: 结构体数组名[下标].成员名 { int num; 例 { int student struct num; 例 struct num; char { char name[20]; int name[20]; stu[1].age++; struct student { char num; int sex; char sex; name[20]; int age; num; {char name[20]; int int age; char sex; }; char sex; }; int char name[20]; age; struct student stu[ ]={{100,“WangLin”,‘M’,20, int char sex; age; struct student stu[ ]={100,“Wang Lin”,‘M’,20}, }stu[ ]={{……},{……},{……}}; {101,“LiGang”,‘M’,19, int age; }stu[ ]={{……},{……},{……}}; 101,“Li Gang”,‘M’,19}, strcpy(stu[0].name,”ZhaoDa”); {110,“LiuYan”,‘F’,19}; }str[3]; 110,“Liu Yan”,‘F’,19}};