day15-结构体与共用体
1.结构体
结构体为自定义数据类型(构造类型)
结构体可以存储大量不同类型的数据
1)结构体类型的定义
struct 结构体名{
成员变量1;
成员变量2;
成员变量3;
...
};
eg:
struct Student{
int id;
char name;
float score;
};
2)结构体变量的定义
[1]先定义结构体类型,再通过结构体类型定义变量
结构体类型 结构体变量名;
struct Student List;
[2]定义结构体类型的时候,直接定义变量名
struct Student{
int id;
char name;
float score;
}zhangsan, wangwu;
[3]直接定义结构体变量
struct{
int id;
char name[10];
float score;
}lihua;
[4]typedef
typedef struct{
int a;
char b;
}A;
A test1;
3)结构体变量的初始化
struct Student lisi = {29, "Lisi", 59};
4)结构体成员变量的访问
结构体变量名.成员变量名;
printf("id = %d, name = %s,score = %.2f\n",Lisi.id,Lisi.name,Lisi.score);
eg:
#include <stdio.h>
struct Birth{
int year;
int month;
int date;
};
struct Stu{
int id;
char name[10];
float score;
struct Birth birthday;//不能直接写Birth birthday
//前面要记得加上struct
};
int main(int argc, char *argv[])
{
struct Stu ggbond;//在定义结构体变量时前面也要加上struct
ggbond.birthday.year = 2004;//调用结构体中的结构体类型成员变量的成员变量
printf("ggbond.year = %d\n",ggbond.birthday.year);
return 0;
}
2.结构体的大小
结构体的大小采用字节对齐的方式
char --> 1字节对齐
short --> 2字节对齐
int --> 4字节对齐
float --> 4字节对齐
double --> 8字节对齐
结构体大小为最大数据类型的整数倍
内部结构体的最大需求大于外部结构体当前的对其要求,外部结构体会增加必要的填充以满足内部结构体的对其需求
eg1:
结构体Stu所占的内存为32字节
struct Stu{
char a;
char b[11];
double c;
int d;
}test1;
eg2:
所占内存为16字节
struct Test{
char a;
int b;
};
struct {
char a;
struct Test t1;
short b;
}t2;
eg3:
所占内存为24字节
struct Test{
char a;
int b;
};
struct {
char a;
struct Test t1;
double b;
}t2;
3.结构体指针
指向一个结构体的指针
结构体类型 *结构体指针变量名;
eg:
struct Stu{
int id;
char name[10];
float score;
};
struct Stu lisi;//定义一个结构体变量list
struct Stu *p = &list;//定义一个结构体指针指向结构体变量,结构体变量名不为结构体地址,要加&符号,这里与函数名不同,函数名直接作为函数的入口地址
注意:struct Stu --->为结构体类型(数据类型)
eg1:
#include <stdio.h>
struct Stu{
int id;
char name[10];
float score;
};
int main(int argc, char *argv[])
{
//定义一个结构体变量ggbond
struct Stu ggbond = {20,"GGbond",100};
//定义一个结构体指针指向ggbond
struct Stu *p = &ggbond;//记住要加取地址&符号
printf("id = %d,
name = %s,
score = %.2f\n",
p->id,p->name,p->score);
return 0;
}
4.结构体取别名typedef
eg:
typedef struct{
int id;
char name[10];
float score;
}Str, *P_str;
// Str -->该结构体数据类型的别名
// P_str -->该结构体指针类型的别名
int main(int argc, char *argv[])
{
//定义一个结构体变量ggbond
Str ggbond = {20,"GGbond",100};
//定义一个结构体指针指向ggbond
P_str p= &ggbond;
printf("id = %d, name = %s, score = %.2f\n",p->id,p->name,p->score);
//结构体指针的使用是->
return 0;
}
5.结构体数组
1)结构体数组的定义
结构体类型 数组名[元素个数];
struct Stu student[10];
eg1:struct Stu lisi = {20, "Lisi", 60};
struct Stu zhangsan = {21, "Zhangsan", 70};
struct Stu wangwu = {22, "Wangwu", 80};
struct Stu student[3] = {lisi, zhangsan,
eg2:
struct Stu{
int id;
char name[32];
float score;
};
int main(int argc, char *argv[])
{
struct Stu a[3] = {
{23,"xiaoming",90},
{24,"xiaohua",100},
{21,"xiaohong",99}
};//定义一个结构体数组并初始化
for(int i = 0; i < 3; i++)
{
printf("id = %d,
name = %s,
score = %.2f\n",
a[i].id, a[i].name, a[i].score);
}//循环遍历该结构体数组,并打印结构体的成员信息
return 0;
}
6.共用体
union 共用体名{
成员变量1;
成员变量2;
成员变量3;
...
}
1)共用体的成员使用的是同一片空间,共用体的大小为该成员变量中最大类型的大小
//定义一个共用体类型
union test{
char a;
int b;
};
int main(int argc, char *argv[])
{
union test t1;
t1.b = 0x12345678;
t1.a = 0x99;
printf("%#x\n", t1.b);
printf("%ld\n", sizeof(t1));
return 0;
}
练习:
查询员工信息
输入待查询的员工姓名:lihua
打印lihua的员工信息
如果没有相对应的员工姓名,打印提示信息
十一、工程项目管理
1)头文件 .h 文件
基本格式:
xxx.h
#ifndef _XXX_H
#define _XXX_H
1)宏定义
2)结构体的声明
3)函数的声明
4)全局变量的声明
5)取别名
...
#endif
2)功能文件.c
func.c
引入头文件
函数的定义
3)main.c
主程序逻辑代码
注意:多个.c文件应该同时编译
gcc *.c/gcc main.c func.c
vsp func.c打开文件
gcc *.c编译同一路径所有.c文件
ctrl+ww 切换文件