10.1C语言结构体
数组:存放相同数据类型
结构体:可以存放多种数据类型
结构体如何定义呢?
struct 结构体标签名{
结构体包含的成员变量或数组;
}结构体变量;
结构体是多种数据类型的集合,它可以包含多个变量和数组,这些数据可以是多种类型
#include<stdio.h>
int main() {
struct student
{
char *name;//指针变量
int num;
int age;
char group;
float score;
};//必须要有分号
}
注:结构体是一种程序员可以自己定义的数据类型。
基本数据类型:int float char
构造数据类型:struct
数据类型可以用来定义变量,变量是地址的助记符,我们常常用指针变量,因为指针更加灵活。
struct 结构体名 结构体变量
struct student stu1,stu2;
int a,b;
注:如果后面不需要用结构体名再定义结构体变量,那么就可以不写结构体名;但是结构体名、结构体变量名、结构体成员必须有两个。
一般情况下,结构体的各个成员在内存中是连续存储的。
但是在编译器的具体实现过程中,各个成员之间可能不是连续的,会存在缝隙。
注:C语言内存、C语言内存对齐可以提高寻址效率。
结构题成员变量的获取和赋值:
#include<stdio.h>
int main() {
struct s
{
char *name;
int num;
int age;
char group;
float score;
}s1;
s1.name = "ybb";
s1.num = 1912;
s1.age = 18;
s1.group = 'A';
s1.score = 99.5;
printf("%s\n%d\n%d\n%c\n%f\n",s1.name,s1.num,s1.age,s1.group,s1.score);
return 0;
}
结构体成员访问运算符 .
数组成员访问运算符 []
结构体变量名.成员名;
student.name;
结构体成员的赋值可以利用结构成体成员访问运算符再赋值。
#include<stdio.h>
int main() {
struct s
{
char *name;
int num;
int age;
char group;
float score;
}s1 = {
"ybb",1912,18,'A',99.5 };
printf("%s\n%d\n%d\n%c\n%f\n",s1.name,s1.num,s1.age,s1.group,s1.score);
return 0;
}
注:在定义时进行整体赋值,在使用过程中只能逐一赋值。
注:结构体是一种自定义的数据类型,作为创建变量的模版,本身不占用内存空间。而结构体变量本身因为包含了实际的数据所以需要内存空间来存储。
10.2C语言结构体数组
结构体数组:本质是一个数组,本来数组只能存储相同数据类型,但是结构体数组因为数组的每个成员是结构体,所以数组的每个元素是可以存放多种数据类型的结构体。
#include<stdio.h>
int main() {
struct s
{
char *name;
int num;
int age;
char group;
float score;
}s1[]={
{
"ybb0",1912,18,'A',99.5 } ,{
"ybb1",1912,18,'A',99.5 },{
"ybb2",1912,18,'A',99.5 } };
printf("%s\n%d\n%d\n%c\n%f\n", s1[0].name, s1[0].num, s1[0].age, s1[0].group, s1[0].score);
printf("%s\n%d\n%d\n%c\n%f\n", s1[1].name, s1[1].num, s1[1].age, s1[1].group, s1[1].score);
return 0;
}
示例:
#include <stdio.h>
struct {
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}class[] =
{
{
"Li ping", 5, 18, 'C', 145.0},
{
"Zhang ping", 4, 19, 'A', 130.5},
{
"He fang", 1, 18, 'A', 148.5},
{
"Cheng ling", 2, 17, 'F', 139.0},
{
"Wang ming", 3, 17, 'B', 144.5}
};
int main(){
float sum=0;
float avg;
int cal=0;
for (int i = 0; i < 5; i++)
{
sum = sum + class[i].score;
if (class[i].score < 140)
{
cal += 1;
}
}
avg = sum / 5;
printf("%f\n", sum);
printf("%f\n", avg);
printf("%d\n",cal);
return 0;
}
10.3结构体指针
结构体指针的本质是指针,只不过指针指向的位置是结构体。
结构体变量名和数组名不同,数组名在表达式中会被转换成数组指针,而结构体变量名不会。结构体变量名始终代表整个集合本身,去结构体变量的地址必须加&
定义结构体指针:
#include<stdio.h>
int main() {
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stu1={
"Li ping", 5, 18, 'C', 145.0},*pstu=&stu1;
struct stu *pstu = &stu1;
注:结构体和结构体变量需要区分
结构体是一种创建数据类型的模版不占内存,结构体变量是一种实实在在的占用内存的数据。
箭头运算符:通过结构体指针直接取得结构体成员变量
利用结构体指针访问结构体成员变量:
#include<stdio.h>
int main() {
struct stu {
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stu1 = {
"Li ping", 5, 18, 'C', 145.0 }, *pstu = &stu1;
printf("%s\n%d\n%d\n%c\n%f\n", (*pstu).name,(*pstu).num,(*pstu).age,(*pstu).group,(*pstu).score);
printf("%s\n%d\n%d\n%c\n%f\n",pstu->name,pstu->num,pstu->age,pstu->group,pstu->score);
return 0;
}