一、结构体定义
声明一个结构体的格式
struct 结构体名称 {
结构体列表
}
结构体
#include <stdio.h>
// 声明了一个类
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
void main(){
struct student L={
1001,
"LiLei",
'M',
18,
90.5,
"Beijing"
};
// 结构体输出,单独访问结构体内每个成员
printf("%d %s %c %d %5.2f %s\n",L.num,L.name,L.sex,L.age,L.score,L.addr); //输出1001 LiLei M 18 90.50 Beijing
}
结构体数组
#include <stdio.h>
// 声明了一个类
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
void main(){
struct student sarr[3];
for (int i = 0; i < 3; i++) {
scanf("%d%s %c%d%f%s",&sarr[i].num,&sarr[i].name,&sarr[i].sex,&sarr[i].age,&sarr[i].score,&sarr[i].addr);
printf("%d %s %c %d %5.1f %s\n",sarr[i].num,sarr[i].name,sarr[i].sex,sarr[i].age,sarr[i].score,sarr[i].addr);
}
}
// 测试数据
//输入 1001 xiaoha F 25 90.5 Beijing
//输出 1001 xiaoha F 25 90.5 Beijing
//输入 1002 lihaha M 28 99.5 Beijing
//输出 1002 lihaha M 28 99.5 Beijing
//输入 1003 lilei M 23 85.5 ShiJiazhuang
//输出 1003 lilei M 23 85.5 ShiJiazhuang
二、结构体对齐
【规则】结构体的大小必须是其最大成员的整数倍
用上面的类说明 (数组不算最大成员,最大成员在int float char中找)
struct student{
int num; //4字节
char name[20]; //20字节
char sex; //1字节
int age; //4字节
float score; //4字节
char addr[30]; //30字节
};
// 最大成员是4个字节
4+20+1+4+4+30=63(字节)
其中 4/4=1
20/4=5
1/4不能整除所以要"+3"
4/4=1
4/4=1
30/4不能整除所以要"+2"
,
在原有的63个字节上再加5个字节,所以上述结构体大小为68字节
三、结构体指针
结构体变量的指针就是该变量所站的内存端的起始地址,可以设置一个指针变量,指向结构体,该指针变量的值就是结构体变量的起始地址。指针变量也可以指向结构体的元素,快速访问结构体内成员
#include <stdio.h>
struct student{
int num;
char name[20];
char sex;
}
void main(){
struct student s={1001,"lihaha",'M'};
struct student *p=&s;
printf("%d %s %c\n", p->num,p->name,p->sex); // 方法一 输出 1001 lihaha M
printf("%d %s %c\n", (*p).num,(*p).name,(*p).sex); // 方法二 输出 1001 lihaha M
}
【成员选择运算符优先级高于取值运算符优先级】优先使用方法一
四、typedef使用
在上面结构体变量使用时struct student s={}
代码低效,可以使用typedef
#include <stdio.h>
typedef struct student{
int num;
char name[20];
char sex;
} stu, *pstu; //取别名
void main(){
stu s={1001,"lihaha", 'M'};
pstu p=&s; // 等价于 stu *p=&s;
printf("%d %s %c\n", p->num,p->name,p->sex); //输出 1001 lihaha M
}