欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > C语言结构体简介:“结”在一起,“构”成一“体”

C语言结构体简介:“结”在一起,“构”成一“体”

2025/9/15 17:34:09 来源:https://blog.csdn.net/jjmhx/article/details/144809735  浏览:    关键词:C语言结构体简介:“结”在一起,“构”成一“体”

一、什么是结构体

如果要一下子记录很多条数据,咱们一般都会想到用数组,比如记录一个班的学生的成绩。

但是数组有个限制:元素必须是同一数据类型。

如果我们想同时记录一个人的姓名(字符串)、年龄(整型)、身高(浮点型)等信息时,数组就派不上用场了,这时候就要用到结构体。

结构体(struct)内的元素可以有不同的数据类型,它把各路英雄好汉集结到一块儿,组成一队,抱团取暖。这也正是其名字的含义:“结”在一起,“构”成一“体”。

二、结构体的定义

结构体的一般定义形式为:

struct 结构体名{类型名1 成员名1;类型名2 成员名2;……类型名n 成员名n;   };

我们一般把结构体中的元素称为“成员”,这些成员的定义就和定义普通变量的方法一样。结构体就是拉了一伙“成员”,组成个大家庭,这个大家庭的名字由大括号前的结构体名定义。

比如我们定义一个人:

struct Person {char name[50]; //名字int age; //年龄float height; //身高
};

Person就是结构体的名字,Person这个“大家庭”里面有三个成员:name、age、height。

试想一下,如果不用结构体,我们得分别定义多个变量,使用起来既不方便也不直观。有了结构体,组成了大家庭,以后就可以以家庭为单位一次性存储所有信息,是不是很方便?

三、结构体变量的定义

定义结构体只是定义了一种数据类型,就和int一样,并不是变量。比如前面定义的Person只是定义了名字为Person的结构体类型。虽然写了一大堆,但系统并不会为其分配存储空间,因为还没定义变量。只有当定义了结构体变量时,系统才会分配存储空间给该变量。

要定义结构体变量,有以下几种方式:

1.分开定义:先定义结构体类型,再定义变量

比如在定义了前面的Person后,加上一行:

struct Person hero;

它定义了一个结构体变量,变量名为hero。

我们还可以在定义hero时一并进行初始化:

struct Person hero = {"Iron Man", 47, 180.5};

注意,这种用大括号{}的初始化方式只能在定义变量的同时进行,就和数组的初始化是一样的。你不能再定义变量后再用这种方式赋值,比如下面的代码就是错误的:

struct Person hero;
hero = {"Iron Man", 47, 180.5};

2.合并定义:定义结构体类型的同时定义变量

将定义结构体类型和变量合在一处:

struct Person {char name[50]; //名字int age; //年龄float height; //身高
} hero;

因为已经定义了结构体变量,hero与它上面的结构体自然地捆绑在一起,所以这种情况还可以把结构体类型的名字Person省略掉。

四、结构体赋值

1.结构体元素的赋值

结体体内元素的访问形式为:结构体变量名.成员名

如定义了前面的结构体变量hero后,就可以通过hero.name、hero.age、hero.height的方式访问并赋值了。

struct Person {char name[50]; //名字int age; //年龄float height; //身高
};
struct Person hero;
hero.age = 9527;

注:"."称为成员运算符,它在所有运算符中优先级最高。

2.结构体变量的赋值

可以像普通变量那样,对相同类型的结构体变量进行赋值:

struct Person student;
student = hero; //同一结构体变量赋值

五、结构体的注意事项

1.不允许对结构体本身递归定义

结构体中的元素类型不能是结构体本身的类型。如下面的定义是错误的:

struct Person {char name[50]; //名字int age; //年龄float height; //身高struct Person hero; //错误
};

为什么不行呢?它会像递归一样,不断地向下一层扩展结构体,却没有终止条件,因此相当于无限递归(和死循环是一个道理)。

2.结构体内可以包含其它结构体

元素含有结体本身会无限扩展,但含有其他结构体就不存在这个问题了,因此是可以的。

比如:

struct Date {int year;int month;int day;
};struct Person {char name[50]; //名字int age; //年龄float height; //身高struct Date birthday;
};

六、结构体数组

1.定义

像定义普通类型的数组一样,也可以定义结构体数组:

struct Person {char name[50]; //名字int age; //年龄float height; //身高
};
struct Person hero[5];

当然也可以采用前面讲的合并定义形式:

struct Person {char name[50]; //名字int age; //年龄float height; //身高
} hero[5];

2.初始化

struct Person {char name[50]; //名字int age; //年龄float height; //身高
} hero[2]={ {"Iron Man", 47, 180.5}, {"Batman", 39, 140.5}};

七、结构体作为函数参数

结构体变量和普通变量一样,可以作为函数参数。它传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。比如:

void printPersonInfo(struct Person p) {printf("Name: %s\n", p.name);printf("Age: %d\n", p.age);printf("Height: %.1f cm\n", p.height);
}

我们可以直接用下面一行代码打印hero的信息:

printPersonInfo(hero);

八、指向结构体的指针

和普通的指针定义方式基本一样,结构体指针变量的定义形式:struct 结构体名称 *指针变量名

有了指向结构体的指针,那么就有了3种访问结构体成员的方式:

①结构体变量名.成员名

② (*指针变量名).成员名

③指针变量名->成员名

示例代码:

#include<stdio.h>int main(){struct Person {char name[50]; //名字int age; //年龄float height; //身高};struct Person hero = {"Iron Man", 47, 180.5};struct Person *p; // 定义一个指向结构体的指针变量p = &hero; // 指向结构体变量hero//三种方式打印printf("%s, %d, %.1f\n", hero.name, hero.age, hero.height);printf("%s, %d, %.1f\n", (*p).name, (*p).age, (*p).height);printf("%s, %d, %.1f\n", p->name, p->age, p->height);return 0;
}

运行结果:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词