今天, 作为一位喜欢总结知识点的我,将有关自定义结构体的知识点进行了总结,希望得到大家的喜欢。
对于自定义结构体的知识点,我将主要分以下几点为大家分享:结构体类型创建、结构体初始化、结构体内存对齐、位段,位段计算机大小。
1.结构体创捷
关于结构体类型创建,可以分三种方式进行讲解:
//创建结构体的第一种方式,推荐使用这种
struct Student1{
int age;
float score;
char sex;
};
//创建结构体的第二种方式
struct Student2{
int age;
float score;
char sex;
}stu2;
//创建结构体的第三种方式
struct { //结构体的名字可以进行省略
int age;
float score;
char sex;
}stu3;
void print(student1 *stu){
printf("%d %f %c\n",stu->age,stu->score,stu->sex);
}
void print(Student2 *stu){
printf("%d %f %c\n",stu->age,stu->score,stu->sex);
}
void main(){
struct Student1 stu1={12,12,2,'n'};
print(&stu1);
struct Student2 *st=&stu2;
st->age=22;
st->score=22.2;
st->sex='n';
//其实,st->score相当于(*st).score
print(st);
stu3.age=33;
stu3.score=55;
stu3.sex='v';
说到结构体的初始化的同时,我们还应该对结构体变量的定义有一定的了解;
有了结构体类型,那么应该如何定义变量,其实很简单。
struct Poind{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Poind p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值
struct Poind p3={x,y};
struct Stu {
char name[15];//名字
int age;//年龄
};
struct Stu s={"zhangsan",20};
struct Node{
int date;
struct Poind p;
struct Node *next;
}n1={10,{2,3},NULL}; //结构体嵌套初始化
3.结构体内存对齐
关于结构体内存对齐,这是一个特别热门的考点:
首先,让我们一起进行一道例题的深入了解,
struct S1{
char c1;
int i;
char c2;
};
printf("%d\n",sizeof(struct S1));
对于这道题,我相信很多刚接触/未接触结构体内存对齐的同学来说,应该会回答“结果是6”,是的,
就是这样,对于这样的回答,也不以为奇。因为他们认为char占一个字节,int占四个字节,在计算的
过程中,他们并没有考虑到结构体内存对齐。接下来,我们来掌握以下关于结构体对齐规则:
1)第一个成员在与结构体变量偏移量为0的位置处。
2)其他成员变量要对齐到某个数字(对其数)的整数倍的地址处。对其数=编译器默认的一个对其数
与该成员大小的较小者。
vs中默认的值是8
Linux中默认的值是4
3)结构体总大小为最大对其数(每一个成员变量都有一个对其数)的整数倍。
4)如果嵌套了结构体对齐到自己的最大对其数是整数倍处,结构体的整体大小就是最大对齐数(含嵌
套结构体的对齐数)的整数倍。
位段?关于这个词,大家或许会有点疑问。此处的位段就是位段,并不是你们眼里的段位。那么什么
是位段呢?位段的声明和结构是类似的,有俩点不同:
1)位段的成员必须是int、unsigned int 或signed int。
2)位段的成员名后边有一个冒号和一个数字。
struct A{ //位段是不跨平台的
int a:2;
int b:6;
int c:3;
int d:12;
};
A就是一个位段类型。
位段的内存分配:
1)位段的成员可以是int、 unsigned int 、 signed int或者是char(属于整型家族)类型
2)位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。
3)位段涉及很多不确定因素,位段是不跨平台的,注意可移植的程序应该避免使用位段。
位段的跨平台的问题:
1)int位段被当成有符号数还是无符号数是不确定的。
2)位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成17,在16位机器会出问题。)
3)位段中成员在内存中从左到右分配,还是从右到左分配标准尚未定义。
跟结构相比,位段可以达到同样的效果,但是可以很好的解压的空间,但是有跨平台的问题存在。
对于自定义结构体的知识点,我将主要分以下几点为大家分享:结构体类型创建、结构体初始化、结构体内存对齐、位段,位段计算机大小。
1.结构体创捷
关于结构体类型创建,可以分三种方式进行讲解:
//创建结构体的第一种方式,推荐使用这种
struct Student1{
int age;
float score;
char sex;
};
//创建结构体的第二种方式
struct Student2{
int age;
float score;
char sex;
}stu2;
//创建结构体的第三种方式
struct { //结构体的名字可以进行省略
int age;
float score;
char sex;
}stu3;
void print(student1 *stu){
printf("%d %f %c\n",stu->age,stu->score,stu->sex);
}
void print(Student2 *stu){
printf("%d %f %c\n",stu->age,stu->score,stu->sex);
}
void main(){
struct Student1 stu1={12,12,2,'n'};
print(&stu1);
struct Student2 *st=&stu2;
st->age=22;
st->score=22.2;
st->sex='n';
//其实,st->score相当于(*st).score
print(st);
stu3.age=33;
stu3.score=55;
stu3.sex='v';
}
说到结构体的初始化的同时,我们还应该对结构体变量的定义有一定的了解;
有了结构体类型,那么应该如何定义变量,其实很简单。
struct Poind{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Poind p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值
struct Poind p3={x,y};
struct Stu {
char name[15];//名字
int age;//年龄
};
struct Stu s={"zhangsan",20};
struct Node{
int date;
struct Poind p;
struct Node *next;
}n1={10,{2,3},NULL}; //结构体嵌套初始化
3.结构体内存对齐
关于结构体内存对齐,这是一个特别热门的考点:
首先,让我们一起进行一道例题的深入了解,
struct S1{
char c1;
int i;
char c2;
};
printf("%d\n",sizeof(struct S1));
对于这道题,我相信很多刚接触/未接触结构体内存对齐的同学来说,应该会回答“结果是6”,是的,
就是这样,对于这样的回答,也不以为奇。因为他们认为char占一个字节,int占四个字节,在计算的
过程中,他们并没有考虑到结构体内存对齐。接下来,我们来掌握以下关于结构体对齐规则:
1)第一个成员在与结构体变量偏移量为0的位置处。
2)其他成员变量要对齐到某个数字(对其数)的整数倍的地址处。对其数=编译器默认的一个对其数
与该成员大小的较小者。
vs中默认的值是8
Linux中默认的值是4
3)结构体总大小为最大对其数(每一个成员变量都有一个对其数)的整数倍。
4)如果嵌套了结构体对齐到自己的最大对其数是整数倍处,结构体的整体大小就是最大对齐数(含嵌
套结构体的对齐数)的整数倍。
对结构体内存对齐规则了解之后,我们应该知道了以上问题的结果了,是的,结果就是“12”;
位段?关于这个词,大家或许会有点疑问。此处的位段就是位段,并不是你们眼里的段位。那么什么
是位段呢?位段的声明和结构是类似的,有俩点不同:
1)位段的成员必须是int、unsigned int 或signed int。
2)位段的成员名后边有一个冒号和一个数字。
struct A{ //位段是不跨平台的
int a:2;
int b:6;
int c:3;
int d:12;
};
A就是一个位段类型。
位段的内存分配:
1)位段的成员可以是int、 unsigned int 、 signed int或者是char(属于整型家族)类型
2)位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。
3)位段涉及很多不确定因素,位段是不跨平台的,注意可移植的程序应该避免使用位段。
位段的跨平台的问题:
1)int位段被当成有符号数还是无符号数是不确定的。
2)位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成17,在16位机器会出问题。)
3)位段中成员在内存中从左到右分配,还是从右到左分配标准尚未定义。
4)当一个结构包含俩个位段,第二个成员位段比较大,无法容纳第一个位段剩余的位时,是是舍弃还是利
用,还是不确定的。
总结:跟结构相比,位段可以达到同样的效果,但是可以很好的解压的空间,但是有跨平台的问题存在。