一、要点提示
13.1.1结构体的概念
13.1.2 结构体数组
13.1.3结构体指针
14.1.1结构体的概念
结构体的定义
结构体变量的存储特点
结构体变量的引用
结构体的初始化
结构体的定义
1、含义:不同类型数据的集合。
2、功能:用于描述一个“概念”。(或记录)
如:num name sex age score addr
10010 LiFun M 18 87.5 BeiJing
3、定义方法:
方法一:在定义结构体类型的同时,直接给出结构体变量。
如: struct 结构体名
{ 结构体成员变量的定义;
} 变量名1,变量名2,...,变量名n;
方法二:先给出结构体类型的定义,再定义结构体变量。
如: struct 结构体名
{ 结构体成员变量的定义; 例:
} ;
struct 结构体名 变量名1,变量名2,...,变量名n;
方法一: struct student { int number; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2; | 方法二: struct student { int number; char name[20]; char sex; int age; float score; char addr[30]; }; struct studentstudent1,student2; |
(1)“;”的用法;
(2)方法二可以用一个*.h文件来存储结构体的定义。
4、要点:
结构体名(struct):
用于标识一种新的数据类型,即结构体类型。
注意区分结构体类型与基本数据类型的不同,它是复合数据类型。
结构体成员变量与普通变量的定义一样,它还可以是结构体变量。
struct date
{int month,day,year;};
struct student
{ int num;
char name[20];
char sex;
int age;
struct date birthday;
char addr[30];
}student1,student2;
结构体变量的存储特点
如: struct student { int number; char name[5]; char sex; int age; float score; char addr[10]; }student1,student2; struct student所占存储空间的大小为: 各成员变量所占存储单元字节数之和。 | ![]() |
结构体类型变量的引用
一、原则:通过结构体的成员来引用结构体变量。
二、成员的引用方法为:结构体变量名.成员名
三、要点:
1.结构体变量不能整体输入输出,只能对它的成员进行操作.
如:student1.num;
2.如果成员本身又是一个结构体类型,则要使用若干个成员运算符,逐级找到最底层的成员.
如:student1.birthday.day
3.成员变量可以象一般的变量一样进行各种运算,只是在运算时要加上“.”运算符.
4.可以引用成员的地址.
结构体变量的初始化
一、只可以给主函数中或外部存储类别和静态存储类别的结构体变量、数组赋初值。
1、对外部存储类型的初始化.
2、对静态存储类型的结构体变量进行初始化
二、给结构体变量赋初值不能跨越前面的成员而只给后面的成员变量赋值。
例exp8_1:对外部存储类型的初始化.
struct student
{ long number;
char name[20];
char sex; int age;
float score;
char addr[30];
}a={99641,”Li Ping”,’M’,”56 Tianjin Street”};
main()
{ printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,
a.num,a.name,a.sex,a.addr);
}
例exp8_2:对静态存储类型的结构体变量进行初始化.
main() { static struct student
{ long number;
char name[20];
char sex;
int age;
float score;
char addr[30];
}a={99641,”Li Ping”,’M’,”56 Tianjin Street”};
printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”,a.num,a.name,a.sex,a.addr);
}
13.1.2 结构体数组
结构体数组的含义:
数组元素是结构体类型数据的数组称为结构体数组.
※ 结构体数组的定义
※ 结构体数组的初始化
※ 结构体数组的应用举例
※ 结构体数组的定义
一、含义:若干个相同的结构体类型变量组成的数据集合。
二、定义方法:
struct 结构体名
{ 例如:
结构体成员定义;
}数组名[元素个数];
三、结构体数组的使用方法
1、通过数组的下标(或指向数组的指针)来访问结构体变量。
2、再通过结构体变量的成员实现结构体数据的访问。
形式为:数组名[下标].成员名
如:stu[2].name=“Wang Ying”;
struct student { long number; char name[20]; char sex; int age; float score; char addr[30]; }stu[3]; | struct student { long number; char name[20]; char sex; int age; float score; char addr[30];}; struct student stu[3]; |
结构体数组的物理含义:
表示实体(或记录)的个数。 | |
※ 结构体数组的初始化
1、含义:在定义结构体数组时完成数组元素的赋值
2、方法:与一般数组元素赋初值的方法相同。
struct student
{ long number;
char name[20];
char sex;
int age;
float score;
char addr[30];
}a[3]={{99641,”Li Ping”,’M’,”56 Tianjin Street”},
{99341,”Zhang Fan”,”F”,78 Beijing Road”},
{99441,”Ren Zhong”,”M”,34 Shenyang Road”}};
※ 结构体数组的应用举例
例exp8_3: 对候选人得票的统计程序,设有三个候选人,每次输入一个候选人的名字,最后统计出每个候选人的得票的结果.
struct person
{ char name[20];int count;
}leader[3]={“Li”,0,”Zhang”,0,”Fun”,0};
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(“\n”);
for(i=0;i<3;i++)
printf(“%5s:%d\n”,leader[i].name,lader[i].count);}
13.1.3结构体指针
※ 指向结构体变量的指针
※ 指向结构体数组的指针
※ 指向结构体的指针作函数的参数
※ 利用结构体变量构成链表
※ 指向结构体变量的指针
一、含义:
1、结构体变量的指针:
指结构体变量所占内存单元的起始地址
2、指向结构体变量的指针
指向结构体变量的起始地址的指针变量.
二、定义方法与使用
1、结构体指针的定义:
main() { struct student
{ long number;
char name[20];
char sex;
int age;
float score;
char addr[30];
}a={99641,”Li Ping”,’M’,”56 Tianjin Street”},*p=&a;
2、结构体指针的使用:
a.num,a.name,a.sex,a.addr
(*p).num,(*p).name,(*p).sex,(*p).addr;
p->num,p->name,p->sex,p->addr;
三、要点:
1、必须将指针指向一个确定的结构体变量,如:p=&a;
2、通过结构体变量的指针访问结构体的方法为:
a.num、(*p).num、p->num。
3、区分下面的两种用法:
p->n++ 和 ++p->n
※ 指向结构体数组的指针
1、定义方法举例:
例exp8_4:指向结构体数组的指针
struct student
{ long number;char name[20];
char sex;int age;
float score; char addr[30];
}a[3]={{99641,”Li Ping”,’M’,”56 Tianjin Street”},
{99341,”Zhang Fan”,”F”,78 Beijing Road”},
{99441,”Ren Zhong”,”M”,34 Shenyang Road”}};
main() { struct student *p;
for(p=a;p<a+3;p++)
printf(“%ld,%-20s,%2c,%4d,%5.2f,%-20s\n”,
p->num,p->name,p->sex,p->age,p->score,p->addr);
}
2、使用要点:
1.p++:是指针p指向数组的下个元素,而这个元素是由结构体类型数据组成的,它不是一个简单的变量.
2.(++p)->num:先使指针p指向结构体数组当前位置的下一个元素,再访问其元素成员num;
请区别与(p++)->num的不同。
※ 指向结构体的指针作函数的参数
1、用结构体变量的成员作函数的参数与一般变量作函数的参数一致;
2、用指向结构体变量的指针作函数的参数,实参将地址传递给形参,与前面指针作函数参数一致;
3、新版本的c语言允许将整个结构体变量作为函数的参数进行传递,要求形参与实参的类型必须一致,而且程序占用内存大,运行速度慢.
当一个结构体中有一个成员是指向本结构体的指针时,通过这样的指针可以将若干个相同的结构体存储单元连接成一个新的数据结构。举例:
二、功能:可以根据需要动态的开辟存储空间。
1.malloc(size):在内存中动态的分配一个长度为size的连续空间;
2.calloc(n,size):在内存中分配n个长度为size的连续空间;
3.free(ptr):释放由ptr指针指向的内存区域.
二、链表操作
建立链表、在链表插入结点、删除链表结点
单链表的结构:
struct student
{ int num;
float score;
struct student *next;
};
要点:
1、链表中的元素在内存中存放顺序是不连续的。
由next指针来连接各节点。
2、链表数据结构的实现,必须利用指针变量.
建立含n个节点的链表过程:
struct student *creat( )
{struct student *head,*p1,*p2;
n=0;head=NULL;
p1=p2=(struct student *)(malloc(sizeof(struct student)));
scanf(“%ld,%f”,&p1->num,&p1->score);
while(p1->num!=0)
{ n=n+1;if(n==1) head=p1;
else p2->next=p1;
p2=p1;p1=(struct student *)(malloc(sizeof(struct student)));
scanf(“%ld,%f”,&p1->num,&p1->score);}
p2->next=NULL;return(head);}
在链表中插入结点的过程
删除链表结点的过程:
来源: