文章标题

来源:互联网 发布:中国银行淘宝卡 编辑:程序博客网 时间:2024/06/07 20:20

结构体

我们知道存储大量整型数据可以用定义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字节对齐方式,然后方法与上述一致。