1.字节对齐,猜它占几个字节
struct test{
short a; //2+6
struct{
int b; //4+4
double c; //8 //24
char d; //1+7
};
int e; //4+4
};
所以占40个字节
struct test{
short a; //2 + 6
struct{
int b; //4 + 4
double c[10]; //80 //96
char d; //1 + 7
};
int e; //4 + 4
};
//112
struct test{
short a; //2 + 6
struct t{ //在struct之后写了字母t,它从成员变成了类型
double c //8
int b; //4
char d; //1 + 3
};
int e; //4 + 4
};
//在C里依然是32,C++里类型不占大小
在没有特殊要求的情况下,让占用空间小的成员在一起,就是从小到大写.
修改默认对齐数#pragma pack()
#include<stdio.h>
#include<stdlib.h>
//基本数据类型有一个对齐值,就是它自身的大小
//自定义类型有一个对齐值(内部当中最大的类型,比如下面的8)
//程序指定对齐值
//程序有效对齐值
typedef struct test{
char a : 1;// 位域
char b : 1;
char c : 1;
}test;
int main(){
printf("%d\n",sizeof(test));
system("pause");
return 0;
}
使用位域使本来要开辟三个字节变成只开辟一个字节,(因为一个字节8个位,这才用了三个)
1.位域不能跨字节存储
2.位域不能跨类型存储
typedef struct test{
char a : 1;
int b : 1;
}test;
int main(){
printf("%d\n",sizeof(test));
system("pause");
return 0;
}
所以这里是8不是1!它依然要考虑字节对齐.
位段就是位域
结构体传参的时候尽量传结构体的地址.
枚举
自定义类型 : struct enum union
#define SIZE 10
enum{CAPACITY = 100};
int main(){
int n = SIZE;//宏 常量
int m = CAPACITY;//枚举 常量
const int sz = 20;//
system("pause");
return 0;
}
//
枚举示例:
enum TYPE{
ADD,
SUM,
MUL,
DIV
};
结构体示例:
struct TYPE{
char a;
char b;
char c;
char d
};
两个都需要在末尾加分号,但一个用逗号分隔一个用分号分隔.
enum TYPE{
ADD,
SUM,
MUL,
DIV
};
int main(){
printf("%d %d %d %d\n",ADD, SUM, MUL, DIV);
system("pause");
return 0;
}
如果不给里面元素赋值,那么默认后一个的元素是前一个元素+1
试着附一个值(这个值可以是整数的任何数但不能是浮点型):
enum TYPE{
ADD,
SUM = 10,
MUL,
DIV
};
int main(){
printf("%d %d %d %d\n",ADD, SUM, MUL, DIV);
system("pause");
return 0;
}
enum TYPE{
ADD,
SUM,
MUL,
DIV
};
int main(){
printf("%d %d %d %d\n",ADD, SUM, MUL, DIV);
printf("%d\n",sizeof(enum TYPE));
system("pause");
return 0;
}
不管枚举里元素有多少个,枚举的大小永远只有一个
联合体(共用体)
union的声明
union test{
char a;
double b;
char c;
};
int main(){
printf("%d\n",sizeof(union test));
system("pause");
return 0;
}
按最大的元素分配空间
union Un {
int i;
char c;
};
int main(){
union Un un;
//下面输出结果一样吗
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
//下面输出的结果是什么
un.i = 0x11223344; //44 33 22 11
un.c = 0x55; //55 33 22 11
printf("%x\n",un.i);
system("pause");
return 0;
}
联合体仍然存在字节对齐
union Un1 {
int i; //4
char c[5]; //5
};
union Un2 {
int i; //4
short c[7]; //7x2 = 14
};
int main(){
//下面输出的结果是什么
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));