9.1:
结构与数组类似,将一些数据分量聚合成一个整体的数据类型。像数组和指针一样,结构也是一种构造数据类型(或叫派生数据类型)。
结构与数组最大的区别在与数组中所有元素的数据类型必须是相同的,而结构中各个结构成员的数据类型可以不同。
结构类型定义的一般形式:
struct 结构名{
类型名 结构成员名
......
} ;
结构的嵌套定义:相当于套娃,大的实体中有小实体,小实体中还有更小的成员。
注意事项:在定义嵌套结构类型时,必须先定义成员的结构类型,再定义主结构类型。
结构变量的定义和初始化:
定义了结构类型后,还需要定义结构类型变量。
C语言中定义结构变量有三种形式:
(1)单独定义:
先定义一个结构类型,再定义结构类型的变量。
(2)混合定义:
一般形式:
struct 结构名{
类型名 结构成员名
......
}结构变量名表;
(3)无类型名定义:
一般形式:
struct {
类型名 结构成员名
.......
}结构变量名表;
注意事项:由于没有给出结构名,在此定义语句的后面无法在定义这个类型的其他结构变量。
结构变量也可以初始化,即在定义时对其赋初值,
如:struct poop stu={666,NB}; 可以用sizeof计算其存储空间,
如:sizeof(struct poop) 或者sizeof(stu)。
C语言规定:结构类型变量的存储布局按其类型定义中成员的先后顺序排列。
结构变量成员的引用:一般形式:
结构变量名 . 结构成员名 ;
结构变量的整体赋值:略。
/*输出平均分最高的学生的成绩*/
#include<stdio.h>
struct student{ /*学生信息结构定义*/
int sum;
char name[10];
int computer,english,math;
double average;
};
int main()
{
int i,n;
struct student max,stu; /*定义结构变量*/
printf("Enter n:");
scanf("%d",&n);
printf("Enter the student's number,name and course scores:\n");
for(i=1;i<=n;i++){
printf("No.%d",i);
scanf("%d%s%d%d%d",&stu.sum,&stu.name,&stu.math,&stu.computer,&stu.english);
stu.average=(stu.math+stu.english+stu.computer)/3.0;
if(i==1){
max=stu;
}else if(max.average<stu.average){
max=stu;
}
}
printf("num:%d,name:%s,average:%.2lf\n",max.sum,max.name,max.average);
return 0;
}
9.2:
一个结构变量只能表示一个实体信息(如上面源程序中变量stu只能表示一个学生信息),如果有许多相同类型的个体,就需要使用结构数组。
结构数组:结构数组是结构和数组的结合体,它的每个数组元素都是一个结构类型的数据,包括多个成员项。 例如 struct campus campuses [100] ,对于该数组,可以引用数组的元素,如campuses[ i ] ,也可以引用结构数组的元素的成员,其一般格式为:
结构数组名 [ 下标 ] . 结构成员名。
由于结构数组中的所有元素都属于相同的结构类型,因此结构数组元素之间可以直接赋值。
/*利用结构数组和冒泡排序排列学生成绩*/
#include<stdio.h>
struct student{
int num;
char name[10];
int Computer,English,math;
double average;
};
int main(void)
{
int i,n,index,j,*px,*py;
struct student students[10]; /*定义结构数组*/
printf("Enter n:");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("Input the info of No.%d:\n",i+1);
printf("number:");
scanf("%d",&students[i].num);
printf("name:");
scanf("%s",students[i].name);
printf("computer score:");
scanf("%d",&students[i].Computer);
printf("English score:");
scanf("%d",&students[i].English);
printf("Math score:");
scanf("%d",&students[i].math);
students[i].average=(students[i].Computer+students[i].English+students[i].math)/3.0;
}
bubble(students[10],n);
printf("num\t name\t average\n");
for(i=0;i<n;i++){
printf("%d\t%s\t%.2lf\n",students[i].num,students[i].name,students[i].average);
}
swap(px,py);
return 0;
}
void bubble(struct student students[],int n){
int i,j;
for(i=1;i<n;i++){
for(j=0;j<n-i;j++){
if(students[j].average<students[j+1].average){
swap(&students[j].average,&students[j+1].average);
}
}
}
}
void swap(int *px,int *py){
int t,j,students[10],average;
t=*px;
*px=*py;
*py=t;
px=&students[j];
py=&students[j+1];
}
9.3 :
结构指针:指向结构变量的指针就是结构变量。
结构类型的数据往往由多个成员组成,结构指针的值实际上是结构变量的首地址,即第一个成员的地址。
有了结构指针,就有两种具体的形式,
(1)用 *p访问结构成员。(2)用指向运算符->访问指针指向的结构成员。
另外,结构指针作为函数参数会比结构变量更有效率,它只需要传递一个地址值。
当需要改变结构成员的值时,便可使用结构指针。