首先,结构体是什么?
当处理一部分问题时如果定义一大堆变量可能会显得麻烦,也不能表现出它们之间的内部关系。比如常见的学生管理系统,学生的个人信息包括学号(int),姓名(char),性别(char),年龄(int),成绩(float)等资料,再比如日期中的年月日等。如果用数组把这所有的资料融入进去,显然是不可以的,毕竟类型都不同,而数组只能是一个类型的,比如常见的int char 型数组。而C语言是允许用户自己建立由不同类型数据组成的组合型的数据结构,即结构体(struct)。
结构体的格式:struct tag {属性};(属性内不能赋予其初值)
结构体的声明:struct A
{
char ch;
int a;
}AAa,AAb; //(这个分号不能丢) AAa AAb都是定义A的同时定义给A的变量
那既然声明的时候不能赋予其初值,那就只能在main函数里进行。
int main()
{
struct A Aa;//定义结构体的变量名
Aa.a=10;
Aa.ch='a';
return 0; }
如果结构体为空?
C++里面空的结构体大小为1;
C里面----->不支持定义空的结构体 至少包含一个对象
typedef在结构体中也有不容小觑的作用,当你的结构体名和变量名过长时,每次调用看起来都会很麻烦,而typedef就可以发挥它的作用给这个结构体起个别名,即给结构体加上typedef后,变量会提升为这种类型。
结构体的访问有两种运算符:.和->,.运算符适用于一般变量的引用,有指针时最好使用->(->相当于解引用),也可以用比如(*p).a,如果用->可表示为:p->a;->显然更简洁,.优先级高于* ,所以如果不加括号就相当于*(p.a)
结构体的大小:
有时候它的结果会让人很懵逼。
struct A
{
char ch;
int a;
}
很多人的答案都会是5,char1个字节,int2个字节,这不正好5个字节。可是答案却是8,这是为啥?
struct的大小会采用内存对齐的方式来计算当前结构体所占内存大小,内存对齐又分为向前对齐和向后对齐。
什么是内存对齐?
放在数据类型字节数能整除的内存地址号下标内。
想象一下32位的计算机,从0~31号,char1个字节先放,int4个字节必须得从4号下标开始存放,所以是8个字节。
再比如
struct B
{
char ch1;
char ch2;
int a;
double b;
} //16
struct C
{
char ch1;
int a;
char ch2;
double b;
} //24 可以想想为啥!