结构体小结

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

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 结构体定义 typedef struct 是一种定义结构体类型的方式,它可以简化结构体类型的使用。使用 typedef struct 可以将结构体类型定义为一个新的类型名,方便在程序中使用。 使用 typedef struct 的语法格式为: typedef struct { // 结构体成员 } 结构体类型名; 其中,结构体成员可以包含各种数据类型,如 int、float、char 等,也可以包含其他结构体类型。 使用 typedef struct 定义结构体类型后,可以直接使用结构体类型名来定义结构体变量,如: 结构体类型名 变量名; 使用结构体变量时,可以通过点号(.)来访问结构体成员,如: 变量名.成员名; 总之,typedef struct 是一种方便定义结构体类型的方式,可以简化程序的编写和阅读。 ### 回答2: 结构体是C语言中用来封装不同数据类型的一种数据结构。为了方便使用结构体,C语言提供了typedef关键字,可以通过定义一个新的类型来简化结构体的使用。具体而言,使用typedef可以将结构体类型定义为一个新的名称,用来代替结构体类型的名字。 typedef struct的基本语法如下: typedef struct 结构体类型名{ //结构体成员变量 }新类型名; 其中,结构体类型名表示定义的结构体类型的名称,新类型名表示为该结构体类型定义的新名称。 结构体中的成员变量可以是任何C语言的数据类型,包括基本数据类型、指针类型等。结构体成员变量定义的方式和普通变量定义方式相同,在结构体内部使用逗号隔开,每个变量名之前可以加上数据类型和修饰符。 使用typedef定义结构体类型有许多好处,如: 1. 简化使用:通过给结构体类型定义一个新名称,可以让结构体类型的使用变得更加简单和方便。 2. 提高可读性:使用新名称定义结构体类型可以提高程序的可读性和代码的可维护性。 3. 方便调用:定义新名称之后,可以直接使用新名称来调用结构体类型,不必再使用原始的结构体类型名称。 4. 隐藏细节:使用typedef让结构体类型的定义和使用更为简单,同时也能够隐藏实现细节,更好地保护程序的安全性。 在实际编程中,typedef结构体类型常用来定义函数返回值类型或函数参数类型。在多人协同开发的项目中,定义好的typedef结构体类型能够为团队中的其他成员提供便利,提高代码的复用率和可维护性。 ### 回答3: 结构体是C语言中非常重要的一个概念,它是由若干个不同的数据类型组成的复合数据类型,可以包含不同类型的数据,可以同时作为函数参数和返回值,从而大大增强了程序的灵活性和可读性。在C语言中,我们使用结构体定义来定义一个结构体类型,通常会使用typedef struct语法来定义。 下面我们来详细讲解结构体定义typedef struct的用法,以及它的使用小结。 1. typedef struct的基本语法 typedef struct 结构体名称{ 数据类型 变量名1; 数据类型 变量名2; …… } 结构体别名; 其中,数据类型可以是任何基本数据类型或自定义的数据类型,变量名可以自定义命名。结构体别名是我们为该结构体类型定义的一个新的别名,用于后续的代码中直接使用。 2. 使用typedef struct的例子 下面是定义一个学生结构体类型,其中包含学生的姓名、性别、年龄和成绩: typedef struct { char name[20]; char sex[10]; int age; float score; } Student; 在使用这个结构体类型时,我们可以直接使用Student作为该类型的别名,如下: void printStudent(Student stu) { printf("name=%s, sex=%s, age=%d, score=%.2f\n", stu.name, stu.sex, stu.age, stu.score); } 在上面的函数中,我们使用了Student类型作为函数的参数,直接传入一个结构体类型的参数,而不需要再次定义结构体类型。 3. typedef struct的使用小结 使用typedef struct可以将结构体类型定义为一个新的类型别名,可以方便地在不同的函数之间传递结构体类型的参数,从而可以大大简化代码,并提高程序的可读性。特别是在处理复杂的数据类型时,typedef struct可以让代码更加清晰明了,容易管理和维护。 总之,typedef struct是C语言中常用的结构体定义语法,它可以使得代码更加清晰明了,易于维护和扩展。熟练掌握该语法,并灵活运用,是每一位C语言程序员必备的技能之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值