C基础:结构体 struct

目录

1.结构体基本用法

1.1 定义

1.2结构体定义格式

1.3 结构体变量

1.3.1 概念

1.3.2 定义格式

1.3.3 定义结构体变量的方式

1.3.4 结构体变量赋值

1.5.3 访问结构体成员变量

1.4 重定义 typedef

1.4.1 基本用法

1.4.2 定义结构体的同时重定义

1.4.3 先定义结构体,然后重定义

2.结构体数组

2.1概念

2.2 定义格式

2.3 初始化

2.4 结构体数组输入输出(for循环)

3.结构体指针

3.1 概念

3.2 定义格式

3.3 结构体指针所指变量中的成员赋值

3.4 大小

3.5 结构体内结构体

4.结构体大小以及对其原则

4.1 结构体大小可以用哦个sizeof得出

4.2 字节对齐原则

4.3 节省空间原则

1.结构体基本用法

1.1 定义

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。

使用结构体的好处:

1.    结构体的使用为处理复杂的数据结构(如链表等)提供了有效的手段。

2.    为函数间传递不同类型的数据提供了方便。

1.2结构体定义格式

struct 结构体名

{

数据类型 成员变量名1;

数据类型 成员变量名2;

数据类型 成员变量名3;

...

};

举例:

struct student
{
    char name[32];
    int age;
    float score;
};

定义了一个名字叫student的结构体数据类型,里面成员有三个分别是name,age和score。

1.3 结构体变量

1.3.1 概念

通过结构体类型定义的变量

1.3.2 定义格式

struct 结构体名 变量名;

1.3.3 定义结构体变量的方式

  1. 先定义结构体,再定义结构体变量

struct 结构体名

{

成员变量;

};

struct 结构体名 变量名;

例如:

struct student s1;

  1. 定义结构体的同时定义结构体变量

struct 结构体名

{

成员变量;

}变量名1, 变量名2;

例如:

struct student
{
    char name[32];
    int age;
}s1,s2;

定义了一个叫student结构体数据类型的同时,用该类型定了两个叫s1和s2的变量。

也可以用缺省结构体名:

struct

{

成员变量;

} 变量名;

1.3.4 结构体变量赋值

先定义一个结构体:

struct student
{
	char name[32];
    int id;
    int age;
};

(1)定义结构体变量时直接使用花括号赋值

struct student s1 = {"xiaoming", 1, 18};

(2)定义结构体变量时用点等法赋值

struct student s2 =

{

.name ="xiaofang",

.id = 2,

.age =18

};

(3)定义结构体变量时未初始化,需要单独给每个成员赋值。用成员访问符. 。

struct student s3;

s3.id=3;

s3.age=19;

strcpy(s3.name, "xiaowang");

1.5.3 访问结构体成员变量

通过.访问: 结构体变量名.成员变量名

例子:

#include <stdio.h>
#include <string.h>

struct student
{
    char name[32];
    int id;
    int age;
} s1, s2;     //定义结构体类型student的同时定义结构体变量s1和s2

int main()
{
    struct student s3 = {"xiaoliu", 1, 19};  //用struct student类型定义变量s3的同时给每个成员赋值
    struct student s4 = {
        .name = "xiaozhang",
        .id = 2,
        .age = 18};

    struct student s5;   //先定义结构体变量s5, 然后访问每个成员的方式赋值
    s5.id = 3;
    s5.age = 290;
    strcpy(s5.name, "yaojing");

    printf("%s %d %d\n", s3.name, s3.id, s3.age);
    printf("%s %d %d\n", s4.name, s4.id, s4.age);
    printf("%s %d %d\n", s5.name, s5.id, s5.age);
}

1.4 重定义 typedef

给数据类型另起名字

1.4.1 基本用法

例如:

typedef int size_t;

此时:int a; 可以写成 size_t a;

总而言之,用数据类型定义变量时变量名写在哪,用typedef重命名时新名字就写在哪然后前面加个typedef就可以了。使用新名字定义变量时直接:新名字 变量名;

1.4.2 定义结构体的同时重定义

typedef struct flower
{
    char name[32];
    char color[32];
} FLOWER;

FLOWER f1;  //等同于 struct flower f1;
struct flower f2;
也可以省略结构体名

1.4.3 先定义结构体,然后重定义

struct flower
{
    char name[32];
    char color[32];
};

typedef struct flower FLOWER;
FLOWER f1;  //等同于 struct flower f1;

2.结构体数组

2.1概念

结构体类型相同的变量组成的数组

2.2 定义格式

1.定义结构体的同时定义结构体数组

struct student
{
    int id;
    int age;
} s[5];

2.先定义结构体,然后定义结构体数组

struct student
{
     int id;
     int age;   
};
struct student s[5];

2.3 初始化

1.定义结构体数组同时赋值

struct student
{
    int id;
    int age;
};
struct student s[3] = {
    {1, 19},
    {2, 20},
    {3, 18}};
2.先定义结构体数组,再对数组的每一个元素中的每个结构体成员分别赋值。
#include <stdio.h>
#include <string.h>

struct student
{
    char name[32];
    int id;
    int age;
};

int main()
{
    struct student s[3];
    strcpy(s[0].name, "xiaoliu");
    s[0].id = 1;
    s[0].age = 19;

    strcpy(s[1].name, "xiaowang");
    s[1].id = 2;
    s[1].age = 18;

    printf("%s %d %d\n", s[0].name, s[0].id, s[0].age);
    printf("%s %d %d\n", s[1].name, s[1].id, s[1].age);
}

2.4 结构体数组输入输出(for循环)

#include <stdio.h>
#include <string.h>

struct student
{
    char name[32];
    int id;
    int age;
};

int main()
{
    struct student s[3];

    for (int i = 0; i < 3; i++)
        scanf("%s %d %d", s[i].name, &s[i].id, &s[i].age);

    for (int i = 0; i < 3; i++)
        printf("%s %d %d\n", s[i].name, s[i].id, s[i].age);
}

3.结构体指针

3.1 概念

指向结构体变量的指针

3.2 定义格式

struct 结构体名 *结构体指针名;

3.3 结构体指针所指变量中的成员赋值

通过指向结构体变量的指针间接的去访问其中的成员:

格式: 指针变量名 -> 成员变量名

p->id =1;

p->age =19;

strcpy(p->name,"li");

或者:(*p).id=2; //不常用

3.4 大小

本质还是指针,8字节。(32位系统4字节)

3.5 结构体内结构体

如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量

关于结构体总结:

1.    不能把结构体类型变量作为整体引用,只能对结构体类型变量中的各个成员变量分别引用

2.    如果成员变量本身属于另一种结构体类型,用若干个成员运算符.一级级找到最低级的成员变量

3.    可以把成员变量当成普通变量运算

4.结构体大小以及对其原则

4.1 结构体大小可以用哦个sizeof得出

sizeof(struct 结构体名);

或者

sizeof(结构体变量名);

结构体数组: 结构体类型大小*元素个数

sizoef(数组名);

4.2 字节对齐原则

例如:

struct stu

{

char a;

int c;

char b;

}; //sizeof(struct stu) 等于12

struct stu

{

char a;

char b;

int c;

}; //sizeof(struct stu) 等于8

  1. 第一个成员在相对于结构体变量起始位置偏移量offset为0的地址处(通俗点来说,就是第一个成员变量的地址与结构体起始位置的地址是相同的),以后每个成员按定义顺序依次存放在offset为该数据成员大小的整数倍的地方,只有double类型存放在4的整数倍的地方(比如int在32位机器位4字节,要从4的整数倍开始存储)。
  2. 用结构体里面最大的数据类型的大小和8(32位系统和4)进行比较,按照字节数小的为单位开辟空间。

4.3 节省空间原则

为了减少空间浪费,把占用空间小的成员集中到一起。

总体上来说,结构体的内存对齐就是一种用空间换取时间的做法,浪费空间来换取性能上的提升。那在设计结构体的时候,我们既要满足对齐,又要节省空间。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值