一、struct结构体
struct 定义结构体类型:
第一个字母大写;
{}后面有;号
结构体名一定能体现结构体的作用(自注释性)
最好写在全局,或者写在头文件(结构体定义在函数内部,只能由该函数调用)
不可以保存函数,但是可以保存函数指针
用.或者->访问结构体变量的成员
初始化(野指针问题、直接给数组名赋值(指针常量))
结构体之间的赋值:浅拷贝;—>深拷贝
浅拷贝(自己写)
释放两次
深拷贝?
//深拷贝 void copy_struct(struct student * s1, const struct Student *s2) { (*s1).num = (*s2).num; (*s1).age = (*s2).num; int len = strlen((*s2).num); (*s1).name = (char *)malloc(sizeof(char) * len + 1);//+1为了'/0' strcpy((*s1).name,(*s2).name); }
struct Student { int num; char name[30]; //char *name; int age; void (*fun)(); }; void print() { printf("hello world"); } //初始化: struct Student stu = {1,"zhangsan",12,printf}; struct Student stu2 = {.num = 1,.name = "zhangsan",.age = 12,.fun = print}; //定义结构体指针 struct Student *pstu = &stu; struct Student stu2 = { .num = 1, .name = "zhangsan", .age = 12, .fun = print }; printf("stu.num = %d\n",stu.num); printf("stu.num = %d\n",(*pstu).num);//`()`一定加,优先的.高,所以加上括号 printf("stu.name = %d\n",(*pstu).name); printf("stu.num = %d\n",pstu->num);//`->`前后不能有空格 printf("stu.num = %d\n",(&stu)->num); struct Student stu3; scanf("%d",&(stu.num)); //stu.name = (char *)malloc(sizeof(char) * 100); //if(NULL == syu.name) //{ // printf("malloc error!\n"); // exit(1); //} //scanf("%s",stu.name); //stu.name = "zhangsan";//数组名不能赋值,是常量 strcpy(stu.name,zhangsan"") scanf("%d"&(stu.age)); //free(stu.name); struct Student stu4; //stu4 = stu; copy_struct(&stu4,&stu3) free(stu3.name); free(stu4.name);
1. 使用注意事项:
字对齐,导致的内存空洞,将相同类型放在一起
结构体的作用:封装数据(打包数据) — 抽象数据
字(4个字节)对其的方式(默认处理方式)(等于4个字节)
ch1 —> 4
num —> 4
ch2 —> 4
首先会为第一数据分配一个字,再看下一时,分析上一个剩余空间是否够用,不够用则新开辟空间
双字(8个字节)对其的方式(默认处理方式)(大于4个字节)
struct node { char ch1; int num; char ch2; }; //特殊 struct node { char ch1; short b; char ch2; int num; };是12个字节 struct node { short b; char ch1; char ch2; int num; };是8个字节
#pragma pack(4) 4个字节对齐 #pragma pack() 恢复默认
2.struct数组
struct Student { int num; char name[20]; int age; } typedef struct Student Stu; int main { Stu AStu[3] = { { .num = 1,.name = "zhangsan",.age = 12 }, { .num = 2,.name = "lisi",.age = 13 }, { .num = 3,.name = "wangwu",.age = 14 } }; for(int i = 0; i < sizeof(AStu) / sizeof(Stu); i++) { printf("num = %d, name = %s , age = %d\n",AStu[i].num,AStu[i].name,AStu[i].age); } }
3.柔性数组
struct node { int len; int src[0]; }; typedef struct node Array; int main() { printf("sizeof(node) = %d\n",sizeof(struct node)); Array a; a.len = 100; a.src = (char *)malloc(sizeof(char) * 100); a.src = (char *)realloc(sizeof(char) * 原有字节长度); }
4.作业???
封装函数
二、union共用体
union定义类型,定义变量和指针、初始化
struct VS union:大小
union大小:保存的成员中最大字节长度的成员所决定:(保持字对齐)
存储方式:所有成员公用一段内存空间(最长字节数的变量)(数据覆盖)
CPU属性:大端字节序、小端字节序
利用共用体判断CPU的大小端字节序
多选一
三、enum枚举
enum:定义一系列整数宏
枚举变量 == 整型变量
enum VS #define
enum:定义一些列整数宏更加便捷,在编译阶段
#define :预处理,不安全,做傻瓜式替换 enum Result { OK, NO, SUCCESS, FAILED }; #define OK 0 #define NO 1 #define SUCCESS 2 #define FAILED 3