自定义类型:结构体,枚举,联合
在c语言中我们会学习到三种基本的自定义类型,其中包括结构体,枚举,联和三种。我不讲解三种的定义以及用法,我们现在就谈谈自定义类型中的坑
结构体
1,在c语言中我们在定义结构体会使用时必须要加上关键字struct去定义结构体实例化。但是在c++中我们不需要加struct关键字,或者使用类。
2,特殊定义的结构体,结构体的定义方法有三种,最基本的定义
#include <stdio.h>
#include <stdlib.h>
struct student{
char name[1024];
char s_num[1024];
};
int main(){
system("pause");
return EXIT_SUCCESS;
}
第二种方法
typedef struct xs{
char name[1024];
char s_num[1024];
}x,*xs;
3,结构体的自引用的时候我们不能去使用一个结构体,原因是我们在计算结构体的时候我们不能去计算出这个结构体的大小,这时候我们可以传递一个结构体的指针,因为我们知道指针是sizeof()是确定的,
#include <stdio.h>
#include <stdlib.h>
struct student{
char name[1024];
char s_num[1024];
struct student* st;
};
int main(){
system("pause");
return EXIT_SUCCESS;
}
4、内存对齐,我们在计算内存的结构体的我们依照三种最基本的法则:
①第一个结构体成员变量是在结构体0偏移位置上
② 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
这里我们需要理解对齐数:编译器默认的对齐数以及该成员变量大小的最小值就是对齐数
③结构体总大小数就是各个成员变量对齐数最大值的倍数。
枚举
①枚举变量默认都是从0开始的一次递增1,在定义的时候我们也可以初始化
#include <stdio.h>
#include <stdlib.h>
enum MyEnum
{
RED = 1,
GREEN = 3,
BLUE = 5
};
int main(){
system("pause");
return EXIT_SUCCESS;
}
②在我们定义一个枚举变量的时候我们在计算下面的枚举变量的时候都会递增1
#include <stdio.h>
#include <stdlib.h>
enum MyEnum
{
RED = 1,
GREEN = 3,
BLUE
};
int main(){
printf("%d", BLUE);
system("pause");
return EXIT_SUCCESS;
}
此时的BLUE的值就是4.
联合
联合是一种特殊的自定义类型,这种类型定义的变量也包含一系列成员,
①联合的成员是共用内存空间的,这样一个联合体变量的大小,至少是最大成员变量的大小,这样才能存储最大变量的值。
②当最大成员大小不是 最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍