结构体
我们知道存储大量整型数据可以用定义int a[N]的方式处理,其他的还有char a[N]、int *p[N]等,但是要存储多个类型的数据就只能靠结构这个数据类型。
结构的概念
结构是一种特殊的数据类型,它由程序员构造而非编程语言固有的基本数据类型.
结构的声明
1.它可以由多个不同的基本数据类型构成,如:
struct student
{
int a;
double b;
char c;
};//注意分号,代表声明结束,就像函数声明一样
2.它也可以由构造的数据类型组成,如:
struct date{
int year;
int month;
};
struct student
{
struct date brithday;
};
结构的引用
当用上述方法声明了结构体类型后,接下来就要用该结构体类型定义一个结构体变量。例如要定义一个struct student类型的名为stu数组,可以在
声明结构体类型的时候定义变量
struct student
{
int StudentID;
char name[10];
char sex;
int score[4];
}stu[16];
也可以声明后再定义
struct student
{
int StudentID;
char name[10];
char sex;
int score[4];
};
struct student stu[16];
结构的内存
结构的内存与对齐方式有关
1.默认的对齐方式
struct sample
{
char a;
int b;
char c;
};
在《c语言程序设计》中,简单的方法是将结构体中每一个变量都与占最大字节数的成员对齐,如上,char型本来只占一个字节,但为其分配和int型占的4个字节(新添的3个字节是空白的),为了能让int型在一次内存访问中通过,因此struct sample共占3*4=12个字节的内存; 另外一种高大上的算法是计算偏移量,第一个数据的偏移量是0,第二个数据的偏移量是1,但是1不是sizeof(int)的倍数,要加上3字节才能成为sizeof(int)的倍数,第三个数据的偏移量是8,是sizeof(char)的倍数,这时总内存为1+3+4+1=9,而9不是sizeof(int)的倍数,再加上3字节,最后总内存就是12.
2.自定义字节对齐方式
用pragmapack(n)来设定变量以n字节对齐方式,然后方法与上述一致。