继上面的基础模块知识之指针之后,我们对数据结构的预备知识——结构体进行记录学习。
在学习 Java之后,我们对面向对象的编程方法更为习惯,因为类Class的出现,让我们对“万事万物皆对象”的理念更为深刻的理解,这也符合人们的思维习惯,并提高开发代码的重用性,从而提高开发效率,在C语言中我们发现结构体(struct)和java中的Class有着异曲同工之妙。
1、结构体是一种新的数据结构类型,因为我们已经知道int、char、float等是基本数据类型。通过封装基本数据类型来构造结构体,并使用该结构体来定义变量。来实现类似Java中的class的类似数据结构:如下
struct Student
{
int num;
char name[20];
char sex;
float score;
}student1,student2……;//这类似于Java中类的实例化对象student1,2
2、也可以在其他函数中通过语句“struct Student student1”来引用该结构体变量。同时,类似地,使用“.”可以访问结构体的内部属性。如下:
#include<stdio.h>
struct Student
{
int num;
char name[20];
char sex;
float score;
};
int main ()
{
struct Student s1;//构造实例化结构体变量
printf("\n请输入学生的学号:\n");
scanf("%d",&s1.num);
printf("\n请输入学生的姓名:\n");
scanf("%s",s1.name);
//清空缓冲区字符
getchar();
printf("\n请输入学生的性别:\n");
scanf("%c",&s1.sex);
printf("\n请输入学生的成绩:\n");
scanf("%f",&s1.score);
printf("\n学生信息如下:%d, %s,%c ,%f\n",s1.num,s1.name,s1.sex,s1.score);
return 0;
}
3.结构体数组,注意以下的数组个数的指定,和不指定数组个数的动态数组,也就是student[]={}空其代码如下:
#include<stdio.h>
struct Student
{
int num;
char name[20];
char sex;
float score;
}stu[5]=
{
{10101,"王明辉",'n',78},
{10102,"王明",'n',78.8},
{10101,"王明辉",'n',78},
{10101,"王明辉",'n',78},
{10101,"王明辉",'n',78}
};
/*也可以不指定数组的数量,而是使用空*/
int main ()
{
int i;
for(i = 0;i<5;i++){
printf("第%d个学生信息:%d,%s,%c,%f\n",i+1,stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
}
printf("\n");
return 0;
}
4.结构体指针。同样地,结构体也有内存地址,也可以由一个指针变量指向其地址。然后就可以实现通过指针来访问结构体各成员。如下代码:
#include<stdio.h>
struct Student
{
int num;
char name[20];
char sex;
float score;
};
/*
指针运算符
“->”
例如:
stu.num
*p.num
stu -> num
实际上是等价的。
*/
int main ()
{
struct Student s1;
struct Student *p;
p= &s1;//指向结构体的指针变量 s
printf("请输入学生的学号:\n");
scanf("%d",&(*p).num);
printf("请输入学生的姓名:\n");
scanf("%s",&(*p).name);
//清空缓冲区字符
getchar();
printf("请输入学生的性别:\n");
scanf("%c",&(*p).sex);
printf("请输入学生的成绩:\n");
scanf("%f",&(*p).score);
printf("学生信息如下:%d, %s,%c ,%f\n",(*p).num,(*p).name,(*p).sex,(*p).score);
return 0;
}
5.指针运算符“->”可以实现对结构体内对象的访问,综合来说,就是:
stu.num
*p.num
stu -> num
实际上是等价的。
6.结构体的嵌套
结构体的成员除了基本数据类型之外,还可以是结构体类型。这就是结构体嵌套。以下是上述例子的改写:
#include<stdio.h>
struct date
{
int year;
int month;
int day;
};
struct Student
{
int num;
char name[20];
char sex;
struct date birthday;
float score;
} s1={10010,"want",'n',{1994,05,15},78.2};
int main()
{
printf("学生信息如下:\n学号:%d \n姓名:%s \n性别:%c \n生日:%d年 %d月 %d日 \n成绩:%f",s1.num,s1.name,s1.sex,s1.birthday.year,s1.birthday.month,s1.birthday.day,s1.score);
return 0;
}