结构体是一种新的数据类型,对C语言的数据类型进行了极大的扩充。数组
struct STU{ int age; char name[15]; }; struct STU a; //结构体实例 struct STU *b; //结构体指针
一、能够经过a.age对其进行取成员的操做,b->age也能够进行结构体的操做,b->age存在问题,必须有一个结构体空间已经让b指向,b的值为此结构体空间的地址。
二、a.name = "lilei"; false,由于name是数组名称,指针常量不能赋值,解决方案:strcpy()函数
三、字符串直接进行比较的话,是其地址的比较,没有什么意义,用strcmp()函数进行比较,就是ASCII码的比较了。函数
操做系统对于内存空间的分配,遵循以下原则:老是从2^n倍数为地址的字节处开始分配空间。
如:若按4B对其模式的话,则每一个变量(结构体成员)的首地址老是从编号为4的整数倍的字节处开始分配空间。
可设几字节对齐以下操作系统
#pragma pack(push) //保持原对齐格式 #pragma pack(1) //设定为n字节格式 ....... #pragma pack(pop) //恢复为原对齐格式
一、结构体大小
(1)、总大小是下一个类型的整数倍,不然用单字节补齐(单字节最多补到4/8,具体看结构体中最宽几字节)
//总大小指的是前面字节总数和当前的字节数之和
(2)、结构体大小是最宽字节的整数倍(通常状况下为4或8)
(3)、上述两个条件必须同时成立。若最终结果不成立的话,则补齐整数倍便可
二、下面举例论证结构体大小
(1)、指针
struct TEST{ int a; short b; char c; struct TEST *next; };
分析以下:4->2->1 (补1字节)->4 共12字节
(2)、借用(1)中的结构体code
struct TEST1{ short d; int e; char f; struct TEST g; struct TEST1 *next; struct TEST h; char i; };
分析以下:2(补2字节)->4->1(补3字节)->12->4(想补也不能补,最多补到最宽单字节,在这最多到4字节,已经为4字节了,因此不能在补了)->12->1。
一共为:41字节,可是结构体大小为最宽单字节的整数倍,在这应为4的整数倍,最终,此结构体大小为44字节。
(3)、借用(1)中的结构体内存
struct TEST2{ short d; int e; double f; struct TEST1 *next; struct TEST g; char i; };
分析以下:2(补2字节)->4->8->4(补4字节:前面一共16字节,当前4字节,因此总共20字节,不是下一个数据类型(12)的整数倍,且最宽为8字节,可补4字节,构成整数倍)->12->1。
一共为37字节,可是结构体大小为最宽单字节的整数倍,在这应为8的整数倍,最终此结构体大小为40字节。
结构体类型极大的扩充了C语言,是数据类型更加丰富多彩。字符串