前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言笔记】结构体

【C语言笔记】结构体

作者头像
正念君
发布2019-06-26 16:35:33
2.2K0
发布2019-06-26 16:35:33
举报
文章被收录于专栏:嵌入式大杂烩嵌入式大杂烩

一、同时定义多个变量

我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float

那么,当我们要做一个学生信息管理系统时,需要保存学生的姓名、学号、年龄等信息,该怎么做呢?

如当要保存三个学生的信息时,

方法一是:
代码语言:javascript
复制
char *name1,*name2,*name3;  // 三个学生的姓名
int num1,num2,num3;         // 三个学生的学号
int age1,age2,age3;         // 三个学生的年龄
方法二是:
代码语言:javascript
复制
// 创建结构体模板
struct student
{
  char *name;  // 学生名字
  int num;     // 学生学号
  int age;     // 学生年龄
};

// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;

显然,方法二跟更清晰,因为它把name、num、age都集成在一个模板,要用的时候只要套用模板进行创建即可。这就是结构体

二、什么是结构体

结构体(struct)是由一系列具有相同类型或不同类型的数据项构成的数据集合,这些数据项称为结构体的成员。如上面的student结构体包含三个成员,分别是name、num、age

结构体是C语言中的一种构造类型。C语言的数据类型如下图:

三、结构体变量的定义方法

方法一
代码语言:javascript
复制
// 创建结构体模板struct student
struct student
{
char *name;  // 学生名字
int num;     // 学生学号
int age;     // 学生年龄
};

// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;

此处,student是结构体名,该名字是由任意定义的,但是尽量起个有意义的名称。其相当于一个模板,可以使用这个模板去定义变量stu1,stu2,stu3。定义的时候不要忘了struct

方法二
代码语言:javascript
复制
// 定义三个结构体变量stu1, stu2, stu3
struct
{
char *name;  // 学生名字
int num;     // 学生学号
int age;     // 学生年龄
}stu1, stu2, stu3;

相对于方法一,此处省略了结构体名。虽然更简洁了,但是因为没有了名字,后面就不能用该结构定义新的变量。

方法三
代码语言:javascript
复制
// 给结构体模板struct student重新命名为student
typedef struct student
{
char *name;  // 学生名字
int num;     // 学生学号
int age;     // 学生年龄
}student;

// 使用student创建三个结构体变量stu1, stu2, stu3
student stu1, stu2, stu3;

此处使用typedef为结构体模板struct student定义一个别名student,关于typedef的介绍移步至往期笔记:【C语言笔记】#define与typedef的区别?进行查看。使用typedef给结构体创建一个别名,这在实际编程用使用非常广泛,如STM32单片机固件库中,使用得很多,如下图:

四、初始化结构

初始化变量和数组如下:

代码语言:javascript
复制
int count = 0;
int arr[7] = {0,1,2,3,4,5,6};

结构体变量是否也可以这样初始化?是的,可以。与初始化数组的语法类似:

代码语言:javascript
复制
struct student stu1 = 
{
  "ZhengNianJun", // 名字:正念君
  520,            // 学号:520
  23              // 年龄:23
};

简而言之,我们使用在一对花括号中括起来的初始化列表进行初始化,各初始化项用逗号分隔。

为了让初始化项与结构中各成员的关联更加明显,我们让每个成员的初始化项独占一行。这样做只是为了提高代码的可读性,对编译器而言,只需要用逗号分隔各成员的初始化项即可。

C99C11为结构提供了指定初始化器(designated initializer)。其初始化器使用点运算符和成员名。例如,只初始化student结构中的name成员,可以这样做:

代码语言:javascript
复制
struct student stu1 =
{
   .name = "ZhengNianJun"
};

也可以按照任意顺序使用指定初始化器:

代码语言:javascript
复制
struct student stu1 =
{
   .age = 24,
   .num = 520,
   .name = "ZhengNianJun"
};

另外,对特定成员的最后一次赋值才是它实际获得的值。例如,考虑如下代码:

代码语言:javascript
复制
struct student stu1 =
{
  .num = 520,
  .name = "ZhengNianJun",
   1314
};

此时,赋给num的值应该是1314,因为它在结构声明中紧跟在name成员之后。新值1314取代了之前的520

指定初始化器在实际编程中也很常用到。如在linux2.6.32.2源码的usb驱动中(路径为:linux-2.6.32.2\drivers\usb\storage\usb.c),有如下代码:

五、访问结构体成员

结构体成员的访问需要借助结构体成员运算符——点(.)。如:

代码语言:javascript
复制
student stu1; // 定义一个结构体变量stu1
stu1.name = "ZhengNianJun"; // 给stu1的成员name赋值
stu1.num = 520;             // 给stu1的成员num赋值
stu1.age = 23;              // 给stu1的成员age赋值
实例
代码语言:javascript
复制
#include <stdio.h>

typedef struct student
{
 char *name;  // 学生名字
 int num;     // 学生学号
 int age;     // 学生年龄
}student;

int main(void)
{
 student stu1;  // 定义一个结构体变量stu1

 /* 给结构体变量stu1的成员进行赋值 */
 stu1.name = "ZhengNianJun";
 stu1.num = 520;
 stu1.age = 23;

 printf("\n============================================\n");
 printf("My name is %s\n", stu1.name);
 printf("My num is %d\n", stu1.num);
 printf("My age is %d\n", stu1.age);
 printf("欢迎关注正念君编程学习笔记!\n", stu1.age);
 printf("============================================\n");

 return 0;
}

程序运行结果为:

结构体是一块很重要的内容,用得很多。关于结构体的内存对齐可查看往期笔记:【C语言笔记】C语言结构体内存对齐问题

以上就是关于结构体的一些笔记,如有错误欢迎指出。谢谢!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、同时定义多个变量
    • 方法一是:
      • 方法二是:
      • 二、什么是结构体
      • 三、结构体变量的定义方法
        • 方法一
          • 方法二
            • 方法三
            • 四、初始化结构
            • 五、访问结构体成员
              • 实例
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档