程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

带你掌握结构体的概念,类型,格式,用法和用途(一)

balukai 2025-01-06 11:15:35 文章精选 15 ℃

点击蓝字,关注我们


往期回顾

指针是C语言的灵魂:一篇文章带你掌握指针的基本概念和用法

C语言的数组:跨越一个阶梯,如何用一种数据结构存储无限多的数据?

01

本节重点

C语言结构体


结构体的概念

结构体是C语言中一种复合数据类型,它可以将不同类型的数据组合成一个整体,称为结构体变量。结构体变量中的每个数据称为结构体成员,它们可以是基本数据类型,也可以是数组,指针,甚至是其他结构体类型。结构体可以用来表示一些复杂的数据结构,如学生信息,图书信息,链表,树等。

结构体的类型

结构体的类型由结构体名和结构体成员列表组成,使用关键字struct来定义。结构体名可以自由命名,但要避免与已有的变量名或类型名冲突。结构体成员列表由一对大括号包围,每个成员占一行,以分号结束。结构体类型的定义格式如下:

例如,定义一个表示学生信息的结构体类型,可以写成:

struct student

{
char name[20]; //姓名
int id; //学号
int age; //年龄
char gender; //性别
float score; //成绩
};


结构体的格式

结构体的格式指的是结构体变量在内存中的存储方式。结构体变量的大小等于所有成员的大小之和,但是由于编译器的对齐规则,结构体变量的实际占用的空间可能会比这个值大一些。结构体变量的地址等于第一个成员的地址,结构体成员的地址按照它们在结构体中的顺序依次排列,每个成员的地址都是它的大小的整数倍。

例如,上面定义的student结构体类型,在32位系统中,每个成员的大小分别为20,4,4,1,4字节,如果按照它们的大小之和,那么结构体变量的大小应该是33字节,但是由于编译器的对齐规则,实际上结构体变量的大小是36字节,因为gender成员的地址要求是4的整数倍,所以在gender前面要补齐3个字节的空白,这样才能保证结构体成员的地址都是它的大小的整数倍。


结构体的用法

结构体的用法主要包括以下几个方面:

- 定义结构体变量

- 访问结构体成员

- 初始化结构体变量

- 复制结构体变量

- 传递结构体变量

- 指向结构体的指针


定义结构体变量

定义结构体变量有两种方式,一种是在定义结构体类型的同时定义变量,另一种是先定义结构体类型,再用结构体类型定义变量。两种方式的区别在于,前者只能定义一次,后者可以多次定义。定义结构体变量的格式如下:

例如,定义一个表示图书信息的结构体变量,可以写成:

//方式一
struct book
 {
  char title[50]; //书名
  char author[20]; //作者
  float price; //价格
} b1; //定义一个book类型的变量b1

//方式二
struct book 
{
  char title[50]; //书名
  char author[20]; //作者
  float price; //价格
};
struct book b2; //定义一个book类型的变量b2

访问结构体成员

访问结构体成员的方法是使用点运算符(.),点运算符的左边是结构体变量的名字,右边是结构体成员的名字。访问结构体成员的格式如下:

通过这种方式,可以获取结构体成员的值,也可以给结构体成员赋值。例如,给b1和b2的成员赋值,并打印它们的值,可以写成:

#include <stdio.h>
#include <string.h> //引入字符串处理函数的头文件
//定义结构体类型
struct book
{
  char title[50]; //书名
  char author[20]; //作者
  float price; //价格
};
int main()
{
  struct book b1; //定义一个book类型的变量b1
  struct book b2; //定义一个book类型的变量b2
  //给结构体成员赋值
  strcpy(b1.title, "C语言程序设计"); //用strcpy函数复制字符串
  strcpy(b1.author, "谭浩强");
  b1.price = 39.8f; //用单精度浮点数赋值
  strcpy(b2.title, "数据结构与算法分析");
  strcpy(b2.author, "Mark Allen Weiss");
  b2.price = 49.9f;
  //打印结构体成员的值
  printf("b1的书名是%s,作者是%s,价格是%.2f元\n", b1.title, b1.author, b1.price);
  printf("b2的书名是%s,作者是%s,价格是%.2f元\n", b2.title, b2.author, b2.price);
  return 0;
}

测试程序:


点赞加关注,学习不迷路

微信公众号|工控小新

EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中


#记录我的2024#

最近发表
标签列表