一、结构体
①概念
- 结构体是一种构造类型(由多种类型拼多多而成)
- 结构体和数组一样,可以存放多个数据变量(称为成员),和数组不同的是它可以存放不同类型成员
②结构体变量的使用(定义、赋值、初始化、打印、传参、返回值、这种类型的数组类型、这种类型的指针类型、等等)
- 声明结构体对应的类型
- 根据声明好的结构体类型,定义对用的结构体变量
- 给结构体变量赋值
- 打印、传参、赋值……
③结构体变量的类型声明
关键字 struct:结构体标识符
struct 类型名称{
char name[ 10];
int numbei[5];
int age;
char sex;
};
在代码中,类型声明后,用struct 标识符表示该结构的类型
struct xxx;表示上面声明的结构体类型
④定义结构体变量
struct xxx yyy;yyy是结构体变量
⑤结构体变量的赋值
struct XXX yyy;
xxx yyy;
yyy = XXX;
strcpy(yyy.name,XXX.name);
⑤结构体的特殊表达
在声明结构体类型的时候,可以间接定义结构体变量: 第一种: struct XXX { char name[10]; int num[5]; int age; char sex; }LDJ,ZSM; 第二种: struct XXX { char name[10]; int num[5]; int age; char sex; }LDJ = {"李大蕉"....},ZSM = {"周树苗"...}; 第三种: struct 少了这个东西 { char name[10]; int num[5]; int age; char sex; }LDJ = {"李大蕉"....}; //不在被调用创建新的就够变量 第四种: typedef:给数据类型去花名。 int去新的名字:my_int; typedef int my_int; // my_int表示int -------------------------------- typedef struct XXX{ char name[10];int num[5];int age; char sex;} xxx; xxx a;定义变量 xxx 表示 struct XXX
⑥ 结构体的大小
1)可以手动认为设置结构体大小:位域 和字节数对齐。(拓展)//搞搞
2)默认的计算方式
struct xxx
{
int a;
short b;
char c;
}XXX;
计算大小的要点:
第一个要点:结构体的首地址一定要是结构体中最胖成员的大小的整数倍。(把结构体的首地址假设为0x00000)
printf("%p---%p\n",&xxx,&(xxx.a));
第二个要点:
要和自身的地址为要和自己的大小形成整数倍关系
自己的地址%自己的大小 == 0
第三个要点:
计算出来的结构体大小一定要是结构体中最宽成员的大小的整数倍。
1)特殊:
struct student
{
char mane[10];
int age;
struct dd
{
int* p;
char a;
};
char sex;
}s1;
注意:
计算结构体的大小时,注意算到小结构体的最后一个成员时,注意满不满足小结构体的大小是不是最宽成员大小的整数倍。
⑦结构体变量传参
#include <stdio.h>
typedef struct student
{
int number;
char name[10];
int age;
}S_S;
int Fun(S_S XM);
int main()
{
//定义结构体变量
S_S XM = {1232,"小明",12};
Fun(XM);
return 0;
}
int Fun(S_S XM)
{
printf("%d--%s--%d\n",XM.number,XM.name,XM.age);
return 0;
}
⑦ 结构体指针变量
#define MSG_LEN 22
typedef struct xxx
{
char msg[MSG_LEN];
}SX,*P_SX;
SX等于struct xxx
P_SX等于 struct xxx *
int main()
{
//定义一个结构体指针变量顺便给他一个合法的地址
//struct xxx * struct_p = (struct xxx*)malloc(sizeof(struct xxx));
P_SX struct_p = (P_SX)malloc(sizeof(SX));
if(struct_p == (void *)0)
{
perror("malloc");
return -1;
}
strcpy((*struct_p).msg,"收到一条信息!");
//strcpy(struct_p->msg,"收到一条信息!");
//printf("%s\n",struct_p->msg);
printf("%s\n",(*struct_p).msg);
return 0;
}
⑧ 结构体数组
它是一个数组,可以存放多个结构体变量(这个都是要同一种结构体类型!)
typedef struct student
{
int number;
char name[10];
int age;
}S_S;
int main()
{
S_S student[2] = {
123,"小明",
321,"明小",21
};
return 0;
}
二、共用体(联合体)
union xxx { int a; double b; char c; }; 大小: 最宽成员的大小 联合体在使用的时候,要一值使用最新的成员变量。
三 枚举 -- 常量集合
enum xxx { a, b, c }; printf("%d---%d--%d\n",a,b,c); 枚举变量大小为4个字节。