嵌入式之路,贵在日常点滴
---阿杰在线送代码
目录
一、什么是结构体
二、定义结构体类型
三、定义结构体变量
四、结构体成员的访问
五、结构体的三种定义赋值方法
六、结构体类型作用域
七、结构体数组
八、结构体指针
实际应用例子:
二级指针
一、什么是结构体
- 结构体和数组一样属于构造类型
- 数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数据的
- 例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。
- 显然这组数据不能用数组来存放, 为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。
二、定义结构体类型
在使用结构体之前必须先定义结构体类型, 因为C语言不知道你的结构体中需要存储哪些类型数据, 我们必须通过定义结构体类型来告诉C语言, 我们的结构体中需要存储哪些类型的数据
- 格式:
struct 结构体名{
类型名1 成员名1;
类型名2 成员名2;
……
类型名n 成员名n;
};
- 示例:
struct Student {
char *name; // 姓名
int age; // 年龄
float height; // 身高
};
三、定义结构体变量
定义好结构体类型之后, 我们就可以利用我们定义的结构体类型来定义结构体变量
格式: struct 结构体名 结构体变量名;
- 先定义结构体类型,再定义变量
struct Student {
char *name;
int age;
};
struct Student stu;
- 定义结构体类型的同时定义变量
struct Student {
char *name;
int age;
} stu;
- 匿名结构体定义结构体变量
struct {
char *name;
int age;
} stu;
第三种方法与第二种方法的区别在于,第三种方法中省去了结构体类型名称,而直接给出结构变量,这种结构体最大的问题是结构体类型不能复用
四、结构体成员的访问
一般对结构体变量的操作是以成员为单位进行的,引用的一般形式为:结构体变量名.成员名
struct Student {
char *name;
int age;
};
struct Student stu;
// 访问stu的age成员
stu.age = 27;
printf("age = %d", stu.age);
五、结构体的三种定义赋值方法
#include
#include
struct student
{
int englishScore;
int mathScore;
int chineseScore;
char name[128];
};//此处分号易漏
int main()
{
//一、在结构体变量定义的时候就赋值,此时要全部赋值
struct student stu1={100,100,100,"张三"};
//二、先定义,后赋值,不需要全部赋值
struct student stu2;
stu2.englishScore = 90;
//stu2.name = "李四";
strcpy(stu2.name,"李四");
//三、常用的部分赋值方式,多见于内核源码对结构体的定义
struct student stu3={
.name = "周浩杰",
.englishScore = 90,
.mathScore = 80, //此处是逗号
};//分号易漏
printf("stu1的名字是:%s,分数:%dn",stu1.name,stu1.englishScore);
printf("stu2的名字是:%s,分数:%dn",stu2.name,stu2.englishScore);
printf("stu3的名字是:%s,分数:%dn",stu3.name,stu3.englishScore);
return 0;
}
运行结果:
stu1的名字是:张三,分数:100 stu2的名字是:李四,分数:90 stu3的名字是:周浩杰,分数:90
为什么使用strcpy?
如果不在结构体变量初始化的时候就对具有数组类型的表达式赋值,则要使用strcpy,即不能直接赋值。
六、结构体类型作用域
- 结构类型定义
- 从定义的那一行开始, 直到遇到return或者大括号结束为止
- 结构类型定义在函数外部的作用域与全局变量的作用域是相同的
- 从定义的那一行开始,直到本文件结束为止
#include "stdio.h"
//定义一个全局结构体,作用域到文件末尾
struct Person{
int age;
char *name;
};
void test();
int main(int argc, const char * argv[])
{
//定义局部结构体名为Person,会屏蔽全局结构体
//局部结构体作用域,从定义开始到“}”块结束
struct Person{
int age;
};
// 使用局部结构体类型
struct Person pp;
pp.age = 50;
//pp.name = "zbz";
printf("局部结构体类型:%dn",pp.age);
test();
return 0;
}
void test()
{
//使用全局的结构体定义结构体变量p
struct Person p = {10,"sb"};
printf("全局的结构体:%d,%sn",p.age,p.name);
}
- 从定义的那一行开始, 直到遇到return或者大括号结束为止
- 从定义的那一行开始,直到本文件结束为止
例题:输入两个学生的名字,学号,成绩,输出成绩高的学生的信息
#include "stdio.h"
#include "string.h"
struct Student
{
int num;
char name[32];
char sex;
int age;
double score;
char addr[32];
};
int main()
{
struct Student stu1 = {1,"李四",'g',17,95.5,"汕头"};
struct Student stu2 = {2,"张三",'b',18,99.5,"东莞"};
struct Student max;
max = stu1;
if(stu1.score < stu2.score)
{
max = stu2;
}
printf("成绩比较好的是:n");
printf("学号:%d,年龄:%d,分数:%lf,名字:%s,地址:%sn",
max.num,max.age,max.score,max.name,max.addr);
//if(stu1.score < stu2.score)
//{
// printf("成绩比较好的是:n");
// printf("学号:%d,年龄:%d,分数:%lf,名字:%s,地址:%sn",
// stu2.num,stu2.age,stu2.score,stu2.name,stu2.addr);
//}
//else
//{
// printf("成绩比较好的是:n");
// printf("学号:%d,年龄:%d,分数:%lf,名字:%s,地址:%sn",
// stu1.num,stu1.age,stu1.score,stu1.name,stu1.addr);
//}
return 0;
}
七、结构体数组
做个简单应用就好:输入4个学生的名字成绩,找出最高分。
#include#include #include struct student { char* name; int score; }; int main() { int i; struct student stu[4] = {0}; for(i=0;i<4;i++) { printf("请输入第%d个学生的名字n",i+1); stu[i].name = (char* )malloc(sizeof(char)*16); memset(stu[i].name,0,sizeof(char)*16); scanf("%s",stu[i].name); printf("请输入他的成绩n"); scanf("%d",&stu[i].score); } struct student stuMax = stu[0];//就像正常的变量一样,可以相互赋值 for(i=1;i<3;i++) { if(stu[i].score > stuMax.score){ stuMax = stu[i]; } } printf("最高分是%s:%dn",stuMax.name,stuMax.score); return 0; }
请输入第1个学生的名字
张三
请输入他的成绩
56
请输入第2个学生的名字
李四
请输入他的成绩
85
请输入第3个学生的名字
王五
请输入他的成绩
95
请输入第4个学生的名字
李六
请输入他的成绩
64
最高分是王五:95
选票系统
#include "stdio.h"
#include "string.h"
struct XuanMin
{
char name[32];
int tickets;
};
int main()
{
struct XuanMin xm[3];
struct XuanMin max;
int feipiao = 0;
int i;
int len;
int j;
int mark = 0;
int total = 5;
char tempName[32];
//初始化选民信息
len = sizeof(xm)/sizeof(xm[0]);
for(i=0;i

