前言
大家伙,这里是鸽子枫(doge),因为工作原因,距离上一期浮游塔的内容以及快过去两个月了。
本期的内容其实在七月就有雏形了,一直没找到时间。
现在,就让我们进入最后一期的内容,结构体吧!
Link Start!
目录
浮游塔第51层:结构体类型的定义
结构体类型的引入
在生活当中,经常需要定义很多变量,那么如何同时定义多个不同类型的变量?
例如:如何同时定义一个人的姓名,年龄,性别的类型数据?
结构体的概念:
C语言中,可以自己构造出自己想要的数据类型,这种类型叫做复合数据类型。
复合数据结构——结构体:是由一系列具有相同类型或不同类型的数据构成的组合型的数据结构。
结构体是一种可以由我们自己定义的数据类型。
如何定义结构体
定义语法:
struct 结构体类型名
{
成员说明列表
};
struct student
{
int num;
char name[20];
int age;
float score;
double avg;
};
说明:
①定义一个结构体类型,结构体的关键字——struct,结构体名为student
②这个结构体可以包含多个不同的基本数据类型
注意:
①结构体的类型可以多种,名字由关键字struct和结构体名组合而成
②访问成员的规则:
(1)结构体普通变量通过“.”来访问成员,demo:Tom.num
(2)结构体指针变量通过“->”来访问成员,demo:p->id
可以先定义结构体,再来定义结构体变量,也可以先定义结构体的同时定义变量。
浮游塔第52层:结构体变量的定义
结构体变量的定义
①先声明,后定义
struct 结构体名
{
数据类型 成员变量名;
数据类型 成员变量名;
数据类型 成员变量名;
...;
};
语法: struct 结构体名 变量名;
#include<stdio.h>
struct student
{
int num;
int c_score;
int PS_score;
float avg;
};
int main(void)
{
struct student Tom;//Tom为结构体变量
Tom.num=10;
Tom.c_score=90;
Tom.PS_score=95;
Tom.avg=92.5;
printf("序号:%d\n",Tom.num);
printf("C语言成绩:%d\n",Tom.c_score);
printf("PS成绩:%d\n",Tom.PS_score);
printf("平均分:%f\n",Tom.avg);
return 0;
}
②在声明类型的同时,定义变量
struct 结构体名
{
数据类型 成员变量名;
数据类型 成员变量名;
数据类型 成员变量名;
...;
}变量名列表;
struct student
{
int num;
int c_score;
int PS_score;
float avg;
}Tom; //Tom是结构体变量
相当于struct student Tom;
③省略结构体名,直接定义结构体变量
struct
{
数据类型 成员变量名;
数据类型 成员变量名;
数据类型 成员变量名;
...;
}变量名列表;
#include<stdio.h>
struct
{
int num;
int c_score;
int PS_score;
float avg;
}Tom={15,90,95,92.5};
int main( )
{
printf("序号:%d\n",Tom.num);
printf("C语言成绩:%d\n",Tom.c_score);
printf("PS成绩:%d\n",Tom.PS_score);
printf("平均分:%f\n",Tom.avg);
}
注意:只能定义一次,接下来不能再定义结构体变量了。
浮游塔第53层:结构体变量的初始化
语法:struct结构体名 变量名={初始化列表值};
#include<stdio.h>
struct student //student为结构体名
{
int num;
int c_score;
int PS_score;
float avg;
}; //定义结构体
int main( )
{
struct student Tom={18,100,98,99.0};//Tom为结构体变量并初始化
}
浮游塔第54层:成员变量的访问
成员变量的访问:
结构体普通变量通过“.”来访问成员,demo:Tom.num
结构体指针变量通过“->”来访问成员,demo:p->id
浮游塔第55层:用Typedef说明一种新类型
typedef struct S
{
int g;
char h;
}T;
typedef用来给变量指定别名,S是结构体名称,T是该结构体的别名,不是变量名。
可以同typedef将已存在的类型用一个新的名字来代表
用typedef定义新的类型名后,原有类型名仍有效。
用typedef可以为各种类型起别名,但不能为变量起别名。
浮游塔第56层:结构体的应用
使用结构体编写全班同学的C语言成绩,PS成绩。
#include<stdio.h>
//定义一个结构体
struct student
{
int c_score;
int PS_score;
};
int main( )
{
//定义了一个结构体变量,struct student 数据类型,Tom是变量名
struct student Tom;
Tom.c_score=98; //给C语言成绩赋值
Tom.PS_score=100; //给PS成绩赋值
//打印,输出相应的内容。
printf("C成绩:%d\n",Tom.c_score);
printf("PS成绩:%d\n",Tom.PS_score);
return 0;
}
浮游塔第57层:结构体变量与结构体指针
结构体指针的定义:
所谓的结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放再一个指针变量中,那么,这个指针变量就是指向该结构体变量。
demo:
//pt 可以指向struct student 类型的变量或数组元素
struct student *pt;
结构体指针怎么访问结构体成员变量:
结构体指针->成员变量
(*结构体指针).成员变量
结构体指针的使用:
demo:
#include <stdio.h>
#include<string.h>
typedef struct student
{
char name[24];
int age;
}STU;
int main(void)
{
STU Tom;
STU *p; //结构体指针
p=&Tom;
//相当于(*p).age=18;
//相当于Tom.age=18;
p->age=18;
strcpy(p->name,"sky");
}
使用结构体变量的指针变量输出学生的信息(包括学号,姓名,成绩)
#include <stdio.h>
#include<string.h>
//定义一个结构体,同时给结构体取一个别名“STU”
typedef struct student
{
char name[24];
long num;
int score;
}STU;
int main(void)
{
STU Tom; //定义一个结构体变量Tom
STU *p; //定义一个结构体指针
p=&Tom; //结构体指针指向结构体变量的首地址
p->num=18; //给结构体成员变量赋值
strcpy(p->name,"sky");
p->score=100;
printf("序号:%ld,",p->num);
printf("姓名:%s,",p->name );
printf("成绩:%d",p->score);
return 0;
}
浮游塔第58层:结构体数组与结构体指针
- 结构体数组的定义
①声明结构体的时候就定义结构体数组:
struct 结构体名
{
成员列表
}数组名[数组长度];
demo:
struct student
{
int num;
int c_score;
int ps_score;
float avg;
}class3[5];
②先声明一个结构体类型,然后再用此类型定义结构体数组:
struct 结构体名
{
数据类型 成员变量名;
数据类型 成员变量名;
数据类型 成员变量名;
...;
};
语法: struct 结构体名 数组名[数组长度]
demo:
struct student
{
int num;
int c_score;
int ps_score;
float avg;
}; //定义结构体
int main( )
{
struct student class3[5];
return 0;
}
- 结构体数组的初始化
结构体类型 数组名[数组长度]={初值列表}
struct Person leader[3] = { "Li", 0, "Zhang", 0, "Sun", 0 };
练习:有n个学生的信息(包括学号、姓名、成绩),找出成绩的最高的学生,并输出该学生的信息
#include<stdio.h>
#define N 5
struct Student
{
int num;
char name[20];
int score;
};
int main( )
{
struct Student stu[N] =
{ { 10101, "Zhang San", 88 },
{ 10102, "Li Si", 67 },
{ 10103, "Wang Er", 98 },
{ 10101, "Sun", 59 },
{ 10101, "Qian", 100 } };
int i = 0;
int max = 0;
for(i=1;i<N;i++)
{
if(stu[i].score > stu[max].score)
max = i;
}
printf("成绩最高的学生:\n");
printf("学号:%d\n",stu[max].num);
printf("姓名:%s\n",stu[max].name);
printf("成绩:%d\n",stu[max].score);
return 0;
}
- 指向结构体数组的指针
结构体指针怎么访问结构体数组成员变量?
(结构体指针+数组元素下标)->成员变量
结构体指针的定义方法:
#include<stdio.h>
typedef struct st
{
char name[24];
int age;
}STU;
int main(void)
{
STU Tom[2]={{"张三",10},{"李四",20}};
STU *p; //结构体指针
int i=0;
p=Tom; //数组元素的首地址
for(;i<2;i++)
{
printf("姓名:%s,年龄:%d\n",(p+i)->name,(p+i)->age);
}
}
后记
那么,到本期,C语言浮游塔的内容就基本告一段落了。
因为本专栏的受众原本就是初学者,故在一些内容上就不会那么的深入。
在接下来的时间里,我回去修改并完善本专栏的全部内容,尽量给大家整的幽默、简单、易懂一些。
谢谢大家三个月以来的观看!