C语言结构体

转载请注明出处,加上原文链接,谢谢!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;
}

|版本二

网站独特的审核机制,本人特此删除相似的第二个版本代码,贴上相似的博文代码链接。

C语言:结构体指针操作学生成绩(再次了解结构体指针的使用)


结构体指针函数综合操学生成绩

#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 唉,时间呀!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值