null第讲第讲结构体类型的变量、数组、指针、函数第十一章 结构体与共用体第十一章 结构体与共用体11.1 结构体类型
结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型
一、结构体类型的定义struct [结构体名]
{
类型标识符 成员名;
类型标识符 成员名;
…………….
};成员类型可以是
基本型或构造型struct是关键字,
不能省略合法标识符
可省:无名结构体例:结构体类型的定义例 struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}; 结构体类型定义只描述结构
的组织形式,不分配内存。结构体类型定义的作用域与变量的作用域类似,若将类型定义放在某个函数内,则只能在该函数内定义这种结构体类型的变量。例:结构体类型的定义二、结构体变量的定义二、结构体变量的定义struct 结构体名
{类型标识符 成员名;
类型标识符 成员名;
…………….
};
struct 结构体名 变量名表列;例 struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
struct student stu1,stu2; 例 #define STUDENT struct student
STUDENT
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
STUDENT stu1,stu2; 1. 先定义结构体类型,再定义结构体变量
一般形式: 2. 定义结构体类型的同时定义结构体变量2. 定义结构体类型的同时定义结构体变量struct 结构体名
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}变量名表列;例 struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu1,stu2; 一般形式:3. 直接定义结构体变量一般形式:struct
{
类型标识符 成员名;
类型标识符 成员名;
…………….
}变量名表列;例 struct
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}stu1,stu2; 用无名结构体直接定义
变量只能一次3. 直接定义结构体变量说明:结构体类型与结构体变量概念不同。
类型:不分配内存; 变量:分配内存
类型:不能赋值、存取、运算; 变量:可以
结构体类型可以嵌套定义。
结构体成员名与程序中变量名可相同,不会混淆。
结构体类型及变量的作用域与生存期。说明:三、结构体变量的引用三、结构体变量的引用1. 引用方式: 结构体变量名.成员名2. 引用规则:结构体变量不能整体引用,只能引用变量成员成员(分量)运算符
优先级: 15(最高)
结合性:从左向右3. 结构体嵌套时应逐级引用
4. 结构体变量可以整体赋值给另一个结构体变量3. 结构体嵌套时应逐级引用
4. 结构体变量可以整体赋值给另一个结构体变量例 struct student
{ int num;
char name[20];
struct date
{ int month;
int day;
int year;
}birthday;
}stu1,stu2 ={101,“Wan Lin”};stu1.birthday.month=12;stu1=stu2; (√)
stu1={102,“Wan Lin”…}; ()四、结构体变量的初始化
形式一:四、结构体变量的初始化
形式一: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 student
{ int num;
char name[20];
char sex;
int age;
char addr[30];
}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”}; 形式三:11.2 结构体数组
一、结构体数组的定义11.2 结构体数组
一、结构体数组的定义形式一:
struct student
{ int num;
char name[20];
char sex;
int age;
};
struct student stu[2];形式二:
struct student
{ int num;
char name[20];
char sex;
int age;
}stu[2];形式三:
struct
{ int num;
char name[20];
char sex;
int age;
}stu[2];二、结构体数组初始化二、结构体数组初始化例:定义类型时省略类型名
struct
{ int num;
char name[20];
char sex;
int age;
}stu[ ]={{……},{……},{……}};顺序初始化:
struct student
{ int num;
char name[20];
char sex;
int age;
};
struct student stu[ ]={100,“Wang Lin”,‘M’,20,
101,“Li Gang”,‘M’,19,
110,“Liu Yan”,‘F’,19}; 例:定义类型的同时,定义变量并初始化
struct student
{ int num;
char name[20];
char sex;
int age;
}stu[ ]={{……},{……},{……}};三、结构体数组引用三、结构体数组引用引用方式: 结构体数组名[下标].成员名例 统计后选人选票struct person
{ char name[20];
int count;
}leader[3]={"Li1",0, "Zhang2",0, "Wang3",0};
void 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++;
}
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}例 统计后选人选票11.3 指向结构体的指针
一、指向结构体变量的指针11.3 指向结构体的指针
一、指向结构体变量的指针存放结构体变量在内存中的起始地址1. 定义形式:struct 结构体名 *结构体指针名;
例 struct student *p;2. 使用结构体指针变量引用成员2. 使用结构体指针变量引用成员(*结构体指针名).成员名结构体指针名->成员名指向成员运算符
优先级: 15 (最高)
结合方向:从左向右例 指向结构体的指针变量struct student stu1;
struct student *p=&stu1;
stu1.num=101; (*p).num=101; *p->num=101;例 指向结构体的指针变量例 指向结构体的指针变量main()
{struct student
{ long int num;
char name[20];
char sex;
float score;
}stu_1,*p;
p=&stu_1;
stu_1.num=89101;
strcpy(stu_1.name,"Li Lin");
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);
}二、指向结构体数组的指针二、指向结构体数组的指针struct student
{ int num;
char name[20];
char sex;
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;pnum,p->name,p->sex,p->age);
}例 指向结构体数组的指针11.4 结构体与函数11.4 结构体与函数1. 结构体类型变量可以作为函数实参 struct data { int a, b, c; };
main()
{ void func(struct data);
struct data arg;
arg.a=27; arg.b=3; arg.c=arg.a+arg.b;
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
printf("Call Func()....\n");
func(arg);
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
}
void func(struct data parm)
{ printf("parm.a=%d parm.b=%d parm.c=%d\n",parm.a,parm.b,parm.c);
printf("Process...\n");
parm.a=18; parm.b=5; parm.c=parm.a*parm.b;
printf("parm.a=%d parm.b=%d parm.c=%d\n",parm.a,parm.b,parm.c);
printf("Return...\n");
}2. 函数可以返回结构体类型的值例11.7 2. 函数可以返回结构体类型的值例11.7 #include
#include
struct student
{char num[10]; char name[20]; float score;};
void PrintStruct(struct student stud)
{printf("%s %s %g\n",stud.num,stud.name,stud.score);}
struct student InitialStruct(char *num,char *name,float score)
{struct student stud; strcpy(stud.num,num);
strcpy(stud.name,name); stud.score=score;
return stud;
}
void main()
{struct student stud ;
stud=InitialStruct("00001","Xiao Li",98.5);
PrintStruct(stud);
}3. 用结构体指针变量作函数参数struct data
{ int a, b, c; };
void main()
{ void func(struct data *parm);
struct data arg;
arg.a=27; arg.b=3; arg.c=arg.a+arg.b;
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
printf("Call Func()....\n");
func(&arg);
printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c);
}
void func(struct data *parm)
{ printf("parm->a=%d parm->b=%d parm->c=%d\n",parm->a,parm->b,parm->c);
printf("Process...\n");
parm->a=18; parm->b=5; parm->c=parm->a*parm->b;
printf("parm->a=%d parm->b=%d parm->c=%d\n",parm->a,parm->b,parm->c);
printf("Return...\n");
}3. 用结构体指针变量作函数参数
本文档为【第23讲 结构体类型的变量、数组、指针、函数】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。