一,结构体的基本用法
查看菜鸟教程:http://www.runoob.com/cprogramming/c-structures.html
二,易错难点
(1)C和C++中结构体的区别
- C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
- C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
- C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。
- C中定义一个结构体类型要用typedef,如下:
typedef struct Complex{
int read;
int image;
}Complex;
那么,在说明Complex变量的时候可以这样写Complex complex;
但是如果没有typedef就必须用struct Complex complex;
这里的Complex实际上就是structComplex的别名。另外这里也可以不写Complex(于是也不能struct Complex complex;了)
typedef struct{
int read;
int image;
}Complex;
但在c++里很简单,直接
struct Complex{
int read;
int image;
};
于是就定义了结构体类型Complex,声明变量时直接Complex complex。
5.在c++中如果用typedef的话,又会造成区别:
struct Complex1{
int read;
int image;
}complex;//complex是一个变量
typedef struct Complex2{
int read;
int image;
}Complex2;//Complex是一个结构体类型
使用时可以直接访问complex.read,但是Complex2则必须先Complex2 complex2;然后complex2.read = 1;
(2)结构体内存对齐
结构体内存对齐:元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始。
for example2:
struct A
{
int a;
char b;
double c;
char d;
};
解析: 在windows系统32位平台上:
int占4个字节
char占1个字节
float占4个字节
double占8个字节
int a从0偏移开始,占四个字节,即占用0,1,2,3,现在可用偏移为4偏移,接下来存char b; 由于4是1的倍数,故而,b占用4偏移,接下来可用偏移为5偏移,接下来该存double c; 由于5不是8的倍数,所以向后偏移5,6,7,都不是8的倍数,偏移到8时,8是8的倍数,故而c从8处开始存储,占用8,9,10,11,12,13,14,15偏移,现在可用偏移为16偏移,最后该存char d ;因为16是1的倍数,故d占用16偏移,接下来在整体向后偏移一位,现处于17偏移,min(默认对齐参数,类型最大字节数)=8;因为17不是8的倍数,所以继续向后偏移18…23都不是8的倍数,到24偏移处时,24为8的整数倍,故而,该结构体大小为24个字节。
内存对齐基本原则:
原则:
1.结构体内成员按自身按自身长度自对齐。
自身长度,如char=1,short=2,int=4,double=8,。所谓自对齐,指的是该成员的起始位置的内存地址必须是它自身长度的整数倍。如int只能以0,4,8这类的地址开始
2.结构体的总大小为结构体的有效对齐值的整数倍
结构体的有效对齐值的确定:
1)当未明确指定时,以结构体中最长的成员的长度为其有效值
2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。
3)当用__attribute__ ((packed))指定长度时,强制按照此值为结构体的有效对齐值