>结构体类型创建
一般的,在声明一个结构提示要使用struct关键字,例如:创建一个学生
struct Stu
char name [20] ;//名字
int age ;//年龄
char sex [5] ;//性别
char id[20] ;//学号
};//!分号不能丢
结构体得特殊声明(没有结构体名):
struct{
int a;
float b;
char c;
}x;没有结构体的标签,就不能在结构体创建完成之后再创建变量,所以必须在创建结构体是就创建出变量,例如上述代码的x变量
结构体成员
结构体的成员可以是标量、数组、指针、甚至是其他结构体,但是不能是自己的一个结构体创建的变量,原因在于这个结构体无法计算自己的大小。
结构体成员的访问
结构体变量的成员是通过成员操作符(.)访问的,(.)接受两个操作数,以上面Stu结构体举例:
struct Stu S;
S.age = 20;补充:在创建一个结构体变量时写struct Stu S; 较为繁琐,所以在创建结构体时在struct关键字前面加上typedef,在最后的分好前加上一个新名字,这样就是结构体变量的创建较为简洁,如下:
typedef struct Stu{
...
...
}Stu;
Stu S;
S.age = 20;>结构体初始化
structStu//类型声明
{
char name[15];//名字
int age;//年龄
};
struct Stu S = {"zhangsan",20};
struct Node{
int data;
struct Point P;
struct Node* next;
}n1 = {10,{4,5},NULL} ;
struct Node n2 = {20,{5,6},NULL};>结构体内存对齐
结构体内存对其的规则:
1、第一个成员在与结构体变量偏移量为0的地址处
2、其他成员变量要对齐到某个数字(对齐数)的整数倍地址处
对齐数 = 编辑器默认的一个对齐数 与 该成员大小 的较小值
VS中默认是8
Linux中默认是4
3、结构体大小为最大对齐数(每个成员变量出了第一个成员都有一个对其数)的整数倍
4、如果嵌套了结构体的情况,嵌套的结构体对其到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍
为什么存在内存对齐?
1、平台原因(移植问题)
不是所有平台都能访问任意地址处的任意数据,某些硬件平台只能在某些地址处取特定类型的数据,否则抛出硬件异常
2、性能原因
数据结构(尤其是栈)应该尽可能放在自然边界上对齐,原因在于,为了访问未对齐的内存,处理器需要两次访问内存,而对齐的内存只需要一次访问。
总的来说:结构体的内存对齐是拿空间换时间的做法
>位段,位段计算大小
位段的声明与结构体类似,有两个不同:
1、成员必须是int、unsigned int 和signed int
2、位段的成员后面有一个冒号和一个数字
struct A{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
}A就是一个位段
A创建的变量的大小为8
>枚举
枚举,顾名思义就是列举,把可能的取值一一列举,定义如下:
enum Day{
Mon, //0
Tues, //1
Wed, //2
Thur, //3
Fri, //4
Sat, //5
Sun //6
};1、在没有对其中的成员赋初值是,第一个的值默认为0,后一个比前一个大1,如果对哪个成员赋值了,那么这个被赋值的成员之后的成员比前一个也大1。
2、创建好这个枚举之后,他的成员就是常量,可以对变量赋值,注意,枚举变量只能被枚举常量赋值,例:
enum Day day = sun;枚举的优点
1、增加代码的可读性和可维护性
2、枚举有类型检查,比#define更加严谨
3、放置命名污染
4、便于调试
5、使用方便,一次定义多个常量
>联合(共用体)
联合中,所有的成员共用一块内存空间,联合的大小至少是最大成员的大小,定义如下:
union Un{
char c;
int i;
};联合用来测大小端
#include<stdio.h>
union Un{
int i;
char c;
};
int main()
{
union Un un;
un.i = 1;
printf("%d\n", un.c);
return 0;
}
1261

被折叠的 条评论
为什么被折叠?



