一、先说一下C中的结构体:
作用:为了将不同类型的数据组合成一个有机的整体。
1、定义结构体变量的方式,例子:
struct student//结构体类型名
{
int num;
char name[20];
char sex;
int age;
};
struct student lucy;//结构体变量名
struct student *p = &lucy;//结构体指针变量名
解析:
(1)、结构体类型名:student
指定了一个结构体类型(就如同基本类型-int的类型),它相当于一个模型,但其中并无具体数据,系统对之也不分配实际的内存单元。
(2)、结构体变量名:lucy
实际分配内存空间,为了能在程序中使用结构类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。
(3)、结构体指针变量名:p
指向结构体变量首地址的指针;通过结构体指针即可访问该结构体变量。
以下三种方式等价:
lucy.num = 123;
(*p).num = 123;
p->num = 123;
2、struct的成员对齐
(1)、自然对界--即默认对齐方式,是指按结构体的成员中size最大的成员对齐。
struct是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如array,struct,union等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界条件分配空间。各个成员按照他们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
例如:
struct naturalalign
{
char a;
short b;
char c;
};
在上述结构体中,size最大的是short,其长度为2字节,因而结构体中的char成员a、c都以2为单位对齐。sizeof(naturalalign)的结果等于6。
(2)、指定对界
一般的可以通过下面的方法来改变缺省的对界条件:
使用伪指令#pragma pack (n),编译器将按n个字节对齐;
使用伪指令#pragma pack(),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的n大于结构体中最大的成员的size,则其不起作用,结构体仍按照size最大的成员进行对界。
例如:
#pragma pack (n)
struct naturalalign
{
char a;
int b;
char c;
};
#pragma pack ()
当n为4、8、16时,其对齐方式均一样,sizeof(naturalalign)的结果都等于12。而当n为2时,其发挥了作用,使得sizeof(naturalalign)的结果为6。
3、位段的使用
有时存储一个信息不必用一个或多个字节,只需要一个字节中的一个或几个二进制位;C语言允许在一个结构体中以单位来指定其成员所占内存长度,以位为单位的成员称为“位段”或“位域”。
例如:
struct packed_data
{
unsigned int a:2;
unsigned int b:6;
unsigned int c:4;
unsigned int d:4;
unsigned int i;
}data;
其中,a,b,c,d分别占2位,6位,4位,4位,i为整型占4个字节。
注意:
赋值时,不要超出位段定义的范围;位段成员的类型必须为整型或字符型;一个位段必须存放在一个存储单元中,不能跨两个单元,第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段;位段的长度不能大于存储单元的长度。
二、说一下C++中的类
一般来说,类规范由两个部分组成:
类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口。
类方法的定义:描述如何实现类成员函数。
典型的类声明格式如下:
class classname
{
private:
data member declarations
public:
member function prototypes
};