结构体小结

   这次总结一些关于结构体的一些小知识,从以下几个方面来加以介绍 ,希望能给各位带来一些帮助:
一、结构体类型的声明
结构体是一些值得集合,这些值称为成员变量,结构体的每个成员都可以是不同类型的变量。
eg:

这就是一个结构体变量,用来描述一个 学生的信息,结构体的成员可以是标量数组,指针,甚至可以是其他的结构体。
声明结构体的时候可以是不完全声明,比如:
;

struct
{
    int a;
    int b;
    char c;
}`
;

这是匿名构体类型,省略了结构体标签,这种结构体只能被引用一次,否则可能会有非法的情况出现。
二、结构体类型的访问

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu
{
    char name[20];
    int age;
    char sex[5];
    char tel[15];
};
int main()
{
    struct stu s;
    s.age = 20;
    strcpy(s.name, "wang");
    strcpy(s.sex, "nan");
    strcpy(s.tel, "18400928763");
    printf("name=%s,age=%d,sex=%s,tel=%s", s.name, s.age, s.sex, s.tel);
    system("pause");

    return 0;
}

这是通过操作费用(.)来访问的;如果指向结构体的不是一个变量而是一个指针那么有应该怎么访问呢?答案是用(->)。

struct stu* s;
    s->age = 20;
    strcpy(s->name, "wang");
    strcpy((*s).sex, "nan");
    strcpy((*s).tel, "18400928763");
    printf("name=%s,age=%d,sex=%s,tel=%s", (*s).name, (*s).age, s->sex, s->tel`
;

三、结构体的自引用
在结构体中包含类型为该结构体本省的成员:

struct Node
{
    int data;
    struct Node* next;
}

四、结构体变量的定义和初始化
形如:
struct point
{
int x;
int y;
}p1;//声明结构体变量的同时,定义结构体变量p1
struct point p1={x,y};//赋初值

struct stu
{
    char name[18];
    int age;
};
struct stu s = { "lory", 18 };

五、结构体的内存对齐
定义了一个结构体后,我们还需要知道如何计算结构体的大小,要想计算结构体的大小,就必须要知道内存对齐这一知识点。


为什么会是12呢,按照我们常规的想法应该是6,现在就这一问题进行分析。
首先我们需要了解对齐规则:
1、第一个成员在与结构体变量偏移量为0的地址处。
2、其他成员变量要对齐到某个数字(对齐数)的整数倍地址处。(对齐数=编译器默认的一个对齐数与该成员大小的较小值,vs中默认值为8,linux中默认为4)
3、结构体大小为最大对齐数的整数倍。
4、如果嵌套了结构体的情况下,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍。
按照这个规则,为了帮助理解,做了下图:

下面再举几个例子:


总的来说结构体的内存对齐是用空间来换时间。因为访问未内存对齐的空间,处理器需要做两次访问内存,而访问内存对齐的空间,处理器只需要访问一次空间。我们在使用内存对齐的时候我们既要满足内存对齐,又要节省空间。所以应该让使用内存小的成员尽量集中在一起。
注意:可以利用pragma()改默认对齐数。
六、结构体传参
传递参数时,参数是需要压栈的,如果传递的是一个结构体变量,结构体过大,参数的压栈系统开销过大,所以会导致性能下降,所以使用指针,传递的是地址就很好的解决了这一问题。


七、位段
位段和结构体类似,但是还有几个区别:
1、位段的成员必须是int ,signed int,unsigned int。
2、位段的成员名后面必须有一个冒号和一个数字(这个数字表示多少个比特位)
3、位段上的空间是按照需要以4个字节(int)或者一个字节(char)的方式来开辟的。
4、位段涉及很多不确定因素,位段是不跨平台的。
5、和结构相比,位段可以达到相同的效果,还能很好的节省空间,但是跨平台问题存在,所以编写可移植程序中应该避免使用位段。

struct A
{
    int a : 2;
    int b : 5;
    int c : 10;
    int d : 30;
};
struct A a;
    printf("%d\n", sizeof(struct A));

猜你喜欢

转载自blog.csdn.net/ffsiwei/article/details/80214159