转载请注明出处,加上原文链接,谢谢!https://blog.csdn.net/weixin_46959681/article/details/112888836
什么是一个结构体
演示代码: structStudent.c
/* structStudent.c */
struct student
{
char name[15];
char sex;
int age;
float scores;
……
};
//不要忘记在定义结构体时,在末位添一个分号。
在上述的几行代码中,含有字符型元素、整型元素、浮点型元素(类型不够可以添加),把一个在校学生的姓名、性别、年龄、年级、身高等等这些 单一维度的信息聚合到一起 形成了一个名为学生的结构体。基于以上的阐述,我们自然地引出结构体的具体定义:
- 不同于内部元素类型单一的数组,结构体是一个信息集合体,其内部可以含有不同的数据类型,并将其存储在同一块内存空间里面。结构体封装的好处就是多次利用,让使用者不必关心这个是什么,仅需根据定义使用就可以了。
其实不仅仅是学生,任何人都可以基于自己的理解对各种事物的不同维度,定义一个属于自己的特定结构体,这一理念是通用的思维模型。
结构体的构造:
struct 结构体变量
{
//单维度特征。
XXX;
XXX;
……
};
结构体变量以及成员的声明
对于结构体内部成员的访问,可以使用两个符号:
- 小数点
.
—— 访问结构体内部的元素。 - 箭头
->
—— 访问指针指向的数据。( 请阅读笔者关于链表的博客。)
结构体变量声明代码演示: struct.c
/* struct.c */
#include <stdio.h>
#include <string.h>
//结构体变量的声明
struct student
{
char name[15];
char sex;
int age;
float scores;
};
//结构体成员的声明。
int main()
{
//方法一:定义并初始化。
struct student stu1 = {"张三", "男", 20, 60};
//方法二:指定成员初始化
struct student stu2={.name="张三", .age=20, .sex="男", .grade=60};
//方法三:指定成员初始化
struct student stu3={name:"张三", sex:"男" age:20, grade:60};
//方法四:先定义,再初始化。
struct student stu4;
strcpy(stu2.name, "张三");
strcpy(stu2.sex, "男");
stu2.age = 20;
stu2.scores = 60;
//打印信息。
printf("姓名:%s\n", stu.name);
printf("性别:%s\n", stu.sex);
printf("年龄:%d\n", stu.age);
printf("成绩:%f\n", stu.scores);
return 0;
}
| 使用结构体配合数组查找学生成绩
演示代码:studentScores.c
/* studentScores.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
struct Student
{
int score;
char *name;
};
int main()
{
int i;
struct Student stus[N]; //结构体数组
struct Student maxstu; //分数最大的结构体成员
struct Student minstu; //分数最小的结构体成员
for(i = 0; i < N; i++){
printf("请输入第%d个学生的名字:\n",i+1);
stus[i].name = (char *)malloc(128);
scanf("%s", stus[i].name);
}
for(i = 0; i < N; i++){
printf("请输入第%d个学生的分数:\n",i+1);
scanf("%d", &stus[i].score);
}
//遍历所输入的信息。
for(i=0; i < N; i++){
printf("%s:%d\n",stus[i].name, stus[i].score);
}
//初学者可以采用这种写法。
maxstu = minstu = stus[0];
for(i=0; i < N; i++)
{
if(maxstu.score < stus[i].score)
{
maxstu = stus[i];
}
if(minstu.score > stus[i].score)
{
minstu = stus[i];
}
}
printf("最高分同学的姓名和分数:%s %d\n", maxstu.name, maxstu.score);
printf("最低的同学的姓名和分数:%s %d\n", minstu.name, minstu.score);
return 0;
}
结构体指针操作学生成绩
在c语言中,结构体不能直接进行强制转换,使用结构体指针才能进行强制转换。
|版本一
/* pointerScores1.c */
#include <stdio.h>
#include <string.h>
struct Student{ int score; char *name; };
int main()
{
int i = 0;
struct Student stus[3];
//此处指针指向结构数组的首地址。
struct Student *p = stus;
for(i = 0; i < N; i++){
printf("请输入学生姓名:\n");
p->name = (char *)malloc(64);
scanf("%s", p->name);
printf("请输入分数:\n");
scanf("%d", &(p->score));
p++;
}
//指针已经偏移,须重新指向数组头。
p = stus;
for(i = 0; i < N; i++){
printf("姓名:%s; 分数:%d\n", p->name, p->score);
p++;
}
return 0;
}
|版本二
网站独特的审核机制,本人特此删除相似的第二个版本代码,贴上相似的博文代码链接。
结构体指针函数综合操学生成绩
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
*初学时三点错误导致本人多耗时1小时;
*1.代码拼写错误,上下问不一致;
*2.多余的符号;
*3.变量 total 的值没有初始化,导致运行时数值随机化。
*/
struct Student
{
int score;
char *name;
};
//学生分数初始化
struct Student* initStuScores(int len)
{
int i;
//每一个学生都是名为 struct Student 的结构体并都有各自的空间。
struct Student *p = (struct Student *)malloc(len * sizeof(struct Student));
for(i = 0; i < len; i++){
printf("请输入学生姓名:\n");
p->name = (char *)malloc(64);
//字符串的本质是地址,指针又能够存储地址。
scanf("%s", p->name);
printf("请输入学生分数:\n");
scanf("%d", &(p->score));
p++;
}
return p-len;
}
//打印指向的结构体中的学生信息。
void printMes(struct Student *p, int len)
{
int i;
for(i = 0; i < len; i++){
printf("姓名:%s,分数:%d\n", p->name, p->score);
p++;
}
}
struct Student* findMaxStu(struct Student *p, int len)
{
int i;
struct Student *max;
max = p;
for(i = 0; i < len; i++){
if(max->score < p->score){
max = p;
}
p++;
}
return max;
}
struct Student* findMinStu(struct Student *p, int len)
{
int i;
struct Student *min;
min = p;
for(i = 0; i < len; i++){
if(min->score > p->score){
min = p;
}
p++;
}
return min;
}
float getAverage(struct Student *p, int len){
int i;
//对应第三点错误:变量 total 的值没有初始化,导致运行时数值随机化。
int total = 0;
for(i=0; i<len; i++){
total = total + p->score;
p++;
}
return (float)(total/len);
}
int main()
{
int len = 0;
printf("请输入学生总人数:\n");
scanf("%d",&len);
struct Student *min = NULL;
struct Student *max = NULL;
struct Student *pstus = initStuScores(len);
printMes(pstus, len);
min = findMinStu(pstus, len);
max = findMaxStu(pstus, len);
printf("min:%s, %d\nmax:%s, %d\n", min->name,min->score,max->name,max->score);
printf("average = %f\n", getAverage(pstus,len));
return 0;
}
文章更新记录
- 什么是结构体 「2021.1.20 19:44」
- 使用结构体配合数组查找学生成绩 「2021.1.21 13:17」
- 结构体指针 「2021.1.30 16:50」
- 结构体指针函数综合操学生成绩 「2021.2.4 22:23」
- 版式修改。 「2021.5.30 21:10」
P.S.1 心乱了几天,学习状态这几天也慢慢调整了回来,继续投入吧!
P.S.2 唉,时间呀!