struct MyClass
{
int a;
char c;
float f;
short s;
double d;
} mc;
// mc最少要有19个字节
//但是! printf("%d\n", sizeof(mc)); 输出 24!
/*
结构体的内存对齐机制
1.结构体的大小,为结构成员最大基本类型的整数倍,double是8
(mc中最大基本类型是double,所以其大小应该为double的整数倍)
2.每一个结构成员后面的结构成员将存储在成员类型大小或n字节边界两者中最小的一个边界上
(挺绕口的,下面来看看怎么算)
int a + char c + float f 这三个变量空间大于double的8字节
故: int a 和 char c 占用8字节,其中int a占用4字节,char c占用1字节浪费3字节。
同理 float f 和 short s占用下一个8字节,float f占用4字节,short占用2字节浪费2字节。
所以,sizeof(mc)=24 。
*/
所以建议在定义结构成员的时候,按类型从大到小的顺序定义,或者从小到大顺序定义,这样有利于内存的优化。
//关于内存对齐还可以举个栗子:比如一个windows中的文本文件,文件大小为20,162kb,占用空间可能为 20,192kb。
//结构体初始化过程中,初值表的顺序和结构成员的定义顺序要完全一致!
结构数组:一个数组,数组里面的元素是结构类型
struct MyPoint
{
int x;
int y;
}
struct MyPoint mt [10];//10个元素都是mypoint类型
//初始化1:struct MyPoint mt1[10] = { {1,2} , {3,4} ,…… };
//初始化2:
for (int a = 0;a<10;a++)
{
mt[a].x= a;
mt[a].y= a;
}
结构指针:一个指针,指向一个结构
struct *pc = mt1; //pc指向结构体变量的首地址!
mt1.x = 20;
pc->i = 20;
结构和函数的组合:
1.结构变量作为函数的形参,函数的值拷贝,为了优化值拷贝过程,尽量用上指针(址传递)
void aaa (struct MyPoint *pt , struct MyPoint*pt1)
{
something();
}
2.结构变量作为函数的返回值,也要注意值拷贝
struct MyPoint bb()
{
struct MyPoint pt;
return pt; //这里只能值拷贝
}
struct MyPoint bb( structMyPoint *pt)
{
return pt; //这里可以地址拷贝
}