一、结构体
1、定义:本质就是自定义的数据类型,struct+结构体名称,理解成一张图纸即可;
2、形式:
struct 结构体名称
{
数据类型 成员名称
};
即 struct 结构体名称 变量名;
3、访问形式:
结构体变量 . 成员名称:表示结构体变量中的某个成员;
4、结构体名称可以省略,但是只能定义结构体的时候定义变量;
5、结构体赋值的三种方法:
1、初始化;
2、赋值;
3、键入;
e.g.
#include <stdio.h>
#include <string.h>
struct student //定义结构体: 本质就是自定义一种数据类型, 类型的名称: struct student
{
int num;
char name[32];
double score;
};
int main01()
{
struct student s = {1001, "xiaoqi", 90.89}; //定义一个结构体变量 初始化!!!!
printf("%d\t%s\t%.2lf\n", s.num, s.name, s.score);
return 0;
}
int main02()
{
struct student s;
s.num = 2222;
strcpy(s.name ,"xiaoqi"); //赋值!!!!
s.score = 100;
printf("%d\t%s\t%.2lf\n", s.num, s.name, s.score);
return 0;
}
int main()
{
struct student s;
printf("请输入学号:");
scanf("%d", &s.num);
while(getchar()!='\n');
printf("请输入姓名:");
scanf("%s", s.name);
while(getchar()!='\n');
printf("请输入成绩:");
scanf("%lf", &s.score);
while(getchar()!='\n');
printf("%d\t%s\t%.2lf\n", s.num, s.name, s.score); //键盘输入!!!!
return 0;
}
二、结构体指针
1、结构体指针变量
struct student *p ;
2、->:
结构体指针变量->成员名称 :表示指针指向的结构体变量的某个成员
3、如何通过指针访问结构体变量成员:
(1)(*指针变量).成员名称
(2) 指针变量->成员名称
#include <stdio.h>
struct student
{
int num;
char name[32];
double score;
};
int main()
{
struct student s = {1001, "zhangsan", 90.89};
struct student *p = &s;
// *p 等价于 s s.num s.name s.score
//printf("%d\t%s\t%.2lf\n", (*p).num, (*p).name, (*p).score);
// p->num: 表示指针指向的结构体变量num这个成员
printf("%d\t%s\t%.2lf\n", p->num, p->name, p->score);
return 0;
}
三、指针操作数组每一个元素的方式
1、指针自增:p++ p->成员名称;
#include <stdio.h>
struct student
{
int num;
char name[32];
double score;
};
struct student s[5] = {{1001, "zhangsan", 90},{1002, "lisi", 89},{1003, "wangwu", 99},{1004, "xxxx", 78},{1005, "yyyy", 88}};
struct student *p = s;
while(p < s+5)
{
printf("%d\t%s\t%.2lf\n", p->num, p->name, p->score);
p ++;
}
return 0;
}
2、指针加上下标的方式: p[i] p[i].成员名称 ;
#include <stdio.h>
struct student
{
int num;
char name[32];
double score;
};
int main()
{
struct student s[5] = {{1001, "zhangsan", 90},{1002, "lisi", 89},{1003, "wangwu", 99},{1004, "xxxx", 78},{1005, "yyyy", 88}};
struct student *p = s;
for(int i=0; i<5; i++)
{
printf("%d\t%s\t%.2lf\n", p[i].num, p[i].name, p[i].score);
printf("%d\t%s\t%.2lf\n", (p+i)->num, (p+i)->name, (p+i)->score);
printf("%d\t%s\t%.2lf\n", (*(p+i)).num, (*(p+i)).name, (*(p+i)).score);
}
return 0;
}
3、数组名加上下标的方式:p+i (*(p+i)).成员名称 (p+i)->成员名称
#include <stdio.h>
struct student
{
int num;
char name[32];
double score;
};
int main()
{
struct student s[5] = {{1001, "zhangsan", 90},{1002, "lisi", 89},{1003, "wangwu", 99},{1004, "xxxx", 78},{1005, "yyyy", 88}};
for(int i=0; i<5; i++)
{
printf("%d\t%s\t%.2lf\n", s[i].num, s[i].name, s[i].score);
printf("%d\t%s\t%.2lf\n", (s+i)->num, (s+i)->name, (s+i)->score);
}
return 0;
}
四、嵌套结构体
1、 定义结构体时, 结构体中的类型应该都是已经存在的类型
2、 如果嵌套结构体,那么该结构体在之前要已经定义过
3、 每一个结构体变量只能访问自己的成员,如果有嵌套结构体成员,要一级一级访问
#include <stdio.h>
struct date
{
int year;
int month;
int day;
};
struct student
{
int num;
char name[32];
struct date bir;
};
int main()
{
struct student s = {1001, "zhangsan", {2020,10,1}};
printf("%d\t%s\t%d-%d-%d\n", s.num, s.name, s.bir.year, \ //初始化!!!!
s.bir.month, s.bir.day);
return 0;
}
int main()
{
struct student s;
printf("请输入学号:");
scanf("%d", &s.num);
while(getchar()!='\n');
printf("请输入姓名:");
scanf("%s", s.name);
while(getchar()!='\n');
printf("请输入出生日期(2020/10/1):");
scanf("%d/%d/%d", &s.bir.year, &s.bir.month, &s.bir.day); //键盘输入!!!!
while(getchar()!='\n');
printf("%d\t%s\t%d-%d-%d\n", s.num, s.name, s.bir.year, \
s.bir.month, s.bir.day);
return 0;
}