一、struct
本质就是具有相同或者不同数据元素的集合
#include<stdio.h>
//定义结构体的本意就是制作类型
struct stu {
char name[30];
int age;
char sex;
int weight;
};
int main()
{
struct stu cls[20];
struct stu zhangsan;
}
给结构体初始化,初始化是可以整体的,但是赋值只能单个的赋值
单个赋值
#include<stdio.h>
#pragma warning(disable:4996)
struct stu {
char name[30];
int age;
char sex;
int weight;
};
int main()
{
struct stu c;
//c.name = "zhangsan";error//数组并不能直接赋值,需要用strcpy
strcpy(c.name, "zhangsan");
c.age = 18;
}
第二种赋值方法
在结构体很大时,采用该方法的效率更高,需要传参的话用该方法更好
struct stu* p = &c;
(*p).age = 18;
p->age = 18;
柔性数组
柔性数组是在结构体中放在最后一个元素的是数组(大小为零的一个是数组),柔性数组的使用是为了,在原始的结构体之后在开辟额外的空间,开辟的空间就是给柔性数组使用
二、union
union称为联合体操作符,union开辟的整个空间是由最大的变量决定的
union un {
int a;
char b;
};
int main()
{
union un x;
printf("%d\n",sizeof(x));
union赋值
union un {
int a;
char b;
char c[20];
};
int main()
{
union un x;
//x.c = "zhangsan";给是数组赋值需要用strcpy
strcpy(x.c, "zhangsan");
x.a = 10;
//第二种赋值的方法
union un* p = &x;
p->a = 10;
}
联合体的所有地址都是一样的
a和b永远在c的低地址出开辟空间
#include<stdio.h>
union un {
int a;
char b;
char c[20];
};
int main()
{
union un x;
printf("%p\n", &x);
printf("%p\n", &(x.b));
printf("%p\n", &(x.c));
return 0;
}
输出结果
联合体与大小端的关系
下面这是两种方式第一种属于小端第二种属于大端
union un {
int a;
char b;
};
int main()
{
union un x;
x.a = 1;
if (1 == x.b)
{
printf("小端");
}
else {
printf("大端");
}
return 0;
}
输出结果
三、enum
在现实当中有一大部分具有相关性的代码需要体现出来,常量名不用数字,而用英文代替有可描述性
如果常量不多的情况下,可以选择用宏,如果常量较多且具有相关性选择用enum
enum color {
RED,
BLUE,
YELLOW,
BLACK
};
int main()
{
enum color c = RED;
printf("%d\n", RED);
printf("%d\n", BLUE);
printf("%d\n", YELLOW);
printf("%d\n", BLACK);
}
输出结果
enum color {
RED=10,
BLUE,
YELLOW,
BLACK
};
int main()
{
enum color c = RED;
printf("%d\n", RED);
printf("%d\n", BLUE);
printf("%d\n", YELLOW);
printf("%d\n", BLACK);
}
输出结果
四、typedef
typedef定义的变量int*和直接定义的指针类型的区别
用宏定义#define定义的类型与typedef的区别
typedef 本身是一种存储类的关键字,与 auto、extern、static、register 等关键字不能出现在同一个表达式中。
typedef static int* int_;//error