我是靠谱客的博主 细心蛋挞,最近开发中收集的这篇文章主要介绍一文攻破结构体-C语言 一文攻破结构体-C语言 ,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一文攻破结构体-C语言

1 什么是结构体

1.1 结构体类型

结构体(structure)是由不同类型数据组成的组合型的数据结构,可以看做变量的集合。结构体也是一个数据类型,就像和 intchar一样的数据类型,只不过 int 等数据类型是系统已经声明好的,而结构体数据类型是由用户根据需要在程序中指定的,并且可以声明很多种。

1.2 结构体类型的声明

声明一个结构体类型的一般形式:

struct 结构体名
{
    成员表列
};

花括号内是该结构体所包括的子项,称为结构体的成员(member),成员可以是一种结构体类型(当前结构体类型或其他结构体类型)的变量。

注意:结构体类型的名字是由一个关键字 struct 和结构体名组合而成的(例如 struct Info)。结构体名是由用户指定的,又称为“结构体标记”(structure tag),以区别于其他结构体类型,即可以设计出许多种结构体类型,而并非只有一种。

struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
};

1.3 定义结构体类型变量

(1)先声明结构体类型,再定义该类型的变量

struct Info info1, info2;
  • struct Info:结构体类型名
  • info1, info2:结构体变量名

(2)在声明类型的同时定义变量,但是这样定义的变量是全局变量

struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
} info;

(3)不指定类型名而直接定义结构体类型变量

struct
{
    成员表列
} 变量名表列;

对于这种方式,将不能再以此结构体类型去定义其他变量。

(4)使用关键字 typedef 定义结构体变量

  • typedef:指定新的类型名来代替已有的类型名
  • 使用格式:typedef {已有的类型名} {新的类型名}
typedef struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
} info;
  • 根据 typedef 的用法,可以得出以下代码段相当于 {已有的类型名}

    struct Info
    {
        int id;
        char name[10];
        int age;
        char sex;
    }
    
  • info 相当于 {新的类型名}

接下来,我们便可以使用结构类型 info 来定义结构体变量,如 info info1

1.4 结构体数据类型变量所占内存

在定义好了结构体变量后,系统会为之分配内存单元。不同的编译系统对结构体变量在内存中分配空间有不同的规定。

Visual C++ 中结构体变量所占内存大小就是其各个成员所占内存大小的和,如下这个结构体变量:

struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
} info;

其成员变量所占的内存大小为 4 + 10 + 4 + 1 = 19,即理论上该结构体变量所占内存大小为 19,实际上其所占内存大小为 20。即当运行 sizeof(info) 时,其输出结果为 20

由于计算机对内存的管理是以“字”为单位的(许多计算机系统以 4 个字节为一个“字”)。如果在一个“字”中只存放了一个字符,虽然只占一个字节,但该“字”中的其他 3 个字节不会接着存放下一个数据,而是从下一个“字”开始存放其他数据,所以用 sizeof 运算符测量变量的长度时,其输出的所占内存大小是 4 的倍数。

2 操作结构体

2.1 结构体变量的初始化

(1)在定义结构体变量时对它的成员初始化

struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
} info = {201807103142, "tianyvHon", 23, 'M'};

(2)通过引用的方式进行初始化

struct Info info = {
    .id = 201807103142;
    .name = "tianyvHon";
    .age = 23;
	.sex = 'M'
};

.name 隐含代表结构体变量 info 中的成员 info.name,如果有未被指定初始化的变量,那么数值型成员被系统初始化为 0,字符型成员被系统初始化为 ,指针型成员被系统初始化为 NULL

2.2 访问结构体成员

结构体成员的访问有点不同于以往的任何变量,它是采用点号运算符·来访问成员的。比如,info.name就是引用 info结构体的 name成员,是一个字符数组,而info.gae则引用info结构体的age成员,是个整型。

(1)在程序中对结构体变量的成员赋值

struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
} info;

info.id = 1;
info.name = "tianyvHon";
info.age = 20;
info.sex = 'M';

(2)在程序中输出结构体变量的成员的值

struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
} info = {201807103142, "tianyvHon", 23, 'M'};

printf("%dn", info.id);

2.3 操作结构体时需要注意的事项

(1)不能企图通过输出结构体变量名来达到输出结构体变量所有成员的值。

  • printf("%sn", info);(错误)

(2)同类的结构体变量可以互相赋值

  • info1 = info2;

(3)可以引用结构体变量成员的地址,也可以引用结构体变量的地址

  • scanf("%d", &info.id);
  • printf("%o", &info);

(4)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)

  • info2.age = info1.age;
  • info1.age++;

3 结构体数组

结构体数组与之前数值型数组的不同之处在于每个数组元素都是一个结构体类型的数据,它们分别包括各个成员项。

定义结构体数组的一般形式:

  • struct 结构体名

    {成员表列} 数组名[数组长度];

    struct Info
    {
        int id;
        char name[10];
        int age;
        char sex;
    } info[3];
    
  • 先声明结构体类型,然后以此类型定义结构体数组

    结构体类型 数组名[数组长度];

    struct Info
    {
        int id;
        char name[10];
        int age;
        char sex;
    };
    struct Info info[3];
    

初始化结构体数组:

  • 在定义数组的后面加上 = {初值表列}

    struct Info
    {
        int id;
        char name[10];
        int age;
        char sex;
    } info[3] = {1, "Hon", 20, 'M', 2, "Wong", 21, 'M', 3, "Tv", 22, 'M'};
    
    struct Info
    {
        int id;
        char name[10];
        int age;
        char sex;
    };
    struct Info info[3] = {1, "Hon", 20, 'M', 2, "Wong", 21, 'M', 3, "Tv", 22, 'M'};
    

4 结构体指针

结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么这个指针变量指向该结构体变量。

(1)指向结构体变量的指针

指针变量的基类型必须与结构体变量的类型相同。定义结构体变量指针的一般格式:struct Info *pi;

struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
} info;

struct Info *pinfo;		// 定义指向 struct Info 类型数据的指针变量 pinfo
pinfo = &info;			// pinfo 指向 info

/*************************** 初始化结构体变量 ***************************/
// 第一种方式
info.id = 2022;
info.name = "tianyHon";
info.age = 23;
info.sex = 'M';

// 第二种方式
(*pinfo).id = 2022;
(*pinfo).name = "tianyvHon";
(*pinfo).age = 23;
(*pinfo).sex = 'M';

// 第三种方式
pinfo->id = 2022;
pinfo->name = "tianyvHon";
pinfo->age = 23;
pinfo->sex = 'M';
  • pinfo = &info;,将结构体变量 info 的起始地址赋给指针变量 pinfo

C 语言中,如果 p 指向一个结构体变量 info,有如下 3 种等价用法:

  • info.成员名
  • (*p).成员名
  • p->成员名

(2)指向结构体数组的指针

可以用指针变量指向结构体数组的元素。

struct Info
{
    int id;
    char name[10];
    int age;
    char sex;
};

struct Info info[3] = {1, "Hon", 20, 'M', 2, "Wong", 21, 'M', 3, "Tv", 22, 'M'};
struct Info *pinfo;

for (pinfo = info; pinfo < info + 3; pinfo++)
{
    printf("%1d %-20s %2d %2cn", p->id, p->name, p->age, p->sex);
}
  • pinfo = info表示 pinfo 的初值为数组 info 序号为 0 的元素的起始地址。
  • pinfo++表示 pinfo 自加 1,执行 pinfo++ 之后 pinfo 的值等于 info + 1,意味着 pinfo 所增加的值为结构体数组 info 的一个元素所占的字节数(在 Visual C++ 中,理论上等于 19,实际上等于 20)。

注意点:

  • (++pinfo)->id:先使 pinfo 自加 1,然后得到 pinfo 指向的元素中的 id 成员值
  • (pinfo++)->id:先求得 pinfo->id 的值,然后再使 pinfo 自加 1,指向 info[1]
  • 指向结构体数组的指针是用来指向结构体类型的对象(结构体数组中的一个元素的起始地址,如 info[0]),而不应用来指向结构体数组元素中的某一成员,如 pinfo = info[1].name;(错误的使用方法),info[1].nameinfo[1] 元素中的成员 name 的首字符的地址。如果一定要将某一成员的地址赋给 pinfo,可以使用强制类型转换,即 pinfo = (struct Info *)info[0].name;

最后

以上就是细心蛋挞为你收集整理的一文攻破结构体-C语言 一文攻破结构体-C语言 的全部内容,希望文章能够帮你解决一文攻破结构体-C语言 一文攻破结构体-C语言 所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部