快速复习“结构体”,附有一道小练习来更好掌握

本文介绍了C语言中的结构体,一种自定义数据类型,用于组合多种数据类型在同一结构中。通过结构体,可以更方便地管理和存储如学生信息等复杂数据。文章详细讲解了结构体的定义、变量的声明与初始化,以及typedef的使用,还涉及结构体数组的定义和初始化。最后提供了一个找最高分学生的代码示例。
摘要由CSDN通过智能技术生成

本文内容均为本人自己学习的时候做的笔记,如有错误,欢迎指出

什么是结构体

结构体是一种可以由我们自己定义的数据类型

为什么要用结构体

先来看一个例子:假如要我们定义变量来存放学生的信息(学号、年龄、身高、体重、分数等)

如果单独定义变量来存放这些信息,是这样的:

int number,age;
float height,weight,score;
number = 101;
age = 21;
height = 161.2;
weight = 55.5;
score = 92.00;

这些只是一个学生的信息,如果是要存放一整个班的学生信息,可以看出,单用普通类型来定义变量的话就变得非常困难,而结构体则有效的解决了这一问题

例如,用结构体来存放信息,是这样的:

struct student
{
    int number;
    int age;
    float height;
    float weight;
    float score;
};

struct student stu[40];

将数据项打包在一起,这样所有的学生都有了共同的属性:学号、年龄、身高、体重、分数,存放信息的时候便于管理数据,同时也提高了代码的可读性。

一个结构体可以包含多个“成员”,每个成员的数据类型可以相同,也可以不相同

结构体类型的定义

定义语法:

    struct 结构体名

    {

        成员列表

    } ;

 上面的代码中,student是结构体名,number,age,height,weight,score都是结构体成员

结构体的类型可以有很多种,名字由关键字struct和结构体名组合而成 

结构体变量 

我们都知道,普通变量的定义是:类型名 变量名

结构体变量也是如此,这里介绍三种方法来定义结构体变量:

方法一:先声明,后定义

 语法:struct  结构体名  变量名 ;

    struct 结构体名
        {
           数据类型  成员变量名 ;
           数据类型  成员变量名 ;
           数据类型  成员变量名 ;
                       ... ... ;
        } ;

举个例子:

struct student
{
    int number;
    int age;
    float height;
    float weight;
    float score;
};

struct student Tom;      //struct student是类型名,Tom是变量名

 方法二:在声明结构体类型的同时,定义结构体变量 

     struct  结构体名
         {
             数据类型  成员变量名 ;
             数据类型  成员变量名 ;
             数据类型  成员变量名 ;
                        ... ... ;
         }变量名列表 ;

举个例子:

struct student
{
    int number;
    int age;
    float height;
    float weight;
    float score;
}Tom;      //Tom是结构体变量

方法三:省略结构体名,直接定义结构体变量(注意:这种定义方法由于没有结构体名,所以只能定义一次结构体变量)

    struct
         {
             数据类型  成员变量名 ;
             数据类型  成员变量名 ;
             数据类型  成员变量名 ;
                        ... ... 
         }变量名列表;

举个例子:

struct
{
    int number;
    int age;
    float height;
    float weight;
    float score;
}Tom,Jerry;      //定义了Tom和Jerry两个结构体变量

这里要注意一点:结构体类型和结构体名是不同的概念,在编译时,对类型是不分配空间的,只对变量分配空间

访问成员的规则

结构体普通变量通过" . "来访问成员,即结构体变量名.成员名,如:Tom.number,Tom.age

结构体指针变量通过"->"来访问成员,如:p->number

结构体变量赋初值

有几种方法可以给结构体变量赋初值,这里只介绍最常用的两种:

方法一:

 如:struct Student Tom = {1001, 21, 165.0, 108.0, 99.5 } ;      //以上面的结构体为例子

方法二:

 Tom . number = 1001;

 Tom . age = 21;

 Tom . height = 165.0;

 Tom . weight = 108.0;

 Tom . score = 99.5; 

typedef的使用 

语法:typedef  已有的类型名  别名; 

注意:它不是用来创造类型,而是给已有的类型取一个别名,别名后面的分号" ; "不能省略

例如:typedef int TYPE ;  //TYPE与int等价,如TYPE a ; 相当于int a ; 

举个例子方便理解:

typedef struct student
{
    int number;
    int age;
}stu;    //stu是struct student类型的别名

stu Tom = {101,21};      //等价于struct student Tom{101,21};

定义别名后,原先的结构体名称也可以继续使用

结构体数组的定义 

方法一:先声明,后定义

语法:struct  结构体名  数组名[数组长度] ;

举个例子:

 struct student
{
    int number;
    int age;
};

struct student stu[5];      //stu为结构体数组,数组长度为5

 方法二:在声明结构体类型的同时,定义结构体数组

 struct  结构体名
         {
             数据类型  成员变量名 ;
             数据类型  成员变量名 ;
             数据类型  成员变量名 ;
                        ... ... 
         }数组名[数组长度] ;

举个例子: 

struct student
{
    int number;
    int age;
}stu[5];      //stu为结构体数组,数组长度为5

结构体数组的初始化

语法:struct  结构体名  数组名[数组长度] = {初值列表} ;

举个例子:

struct student
{
    int number;
    int age;
};

struct student stu[5] = {{1001,21},{1002,20},{1003,18},{1004,25},{1005,24}};
//将1001和21分别赋给stu[0].number和stu[0].age
//将1002和20分别赋给stu[1].number和stu[1].age
//将1003和18分别赋给stu[2].number和stu[2].age
//将1004和25分别赋给stu[3].number和stu[3].age
//将1005和21分别赋给stu[4].number和stu[4].age

下面有一个结构体的小练习,有兴趣的可以做一下,非常简单

/*
    有n个学生的信息(包括学号、成绩)
    找出成绩最高的学生
    并输出该学生的信息 
*/ 

代码如下:

#include <stdio.h>
typedef struct
{
	int num;
	float score;
}stu;

int max_score(stu s[],int n);
void Input(stu s[],int n);

int main()
{
	stu s[5];
	int max;
	Input(s,5);
	max = max_score(s,5);	
	printf("成绩最高的学生学号为:%d  分数为:%.1f",s[max].num,s[max].score);
	return 0;
}

int max_score(stu s[],int n)
{
	int i,max=0;
	for(i=0;i<n;i++)
	{
		if(s[i].score>s[max].score)
		    max = i;
	}
	return max;
}

void Input(stu s[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("请输入第%d个同学的学号和分数:",i+1);
		scanf("%d %f",&s[i].num,&s[i].score);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值