C 语言结构体和枚举完全指南:成员访问、字符串操作、枚举基础

小万哥
• 阅读 283

访问结构体成员

要访问结构体的成员,请使用点语法 (.):

// 创建名为 myStructure 的结构体
struct MyStructure {
  int myNum;
  char myLetter;
};

int main() {
  // 创建名为 s1 的 myStructure 的结构体变量
  struct MyStructure s1;

  // 为 s1 的成员分配值
  s1.myNum = 13;
  s1.myLetter = 'B';

  // 打印值
  printf("My number: %d\n", s1.myNum);
  printf("My letter: %c\n", s1.myLetter);

  return 0;
}

现在您可以使用只使用一个结构体,轻松创建多个具有不同值的结构体变量:

// 创建不同的结构体变量
struct MyStructure s1;
struct MyStructure s2;

// 为不同的结构体变量分配值
s1.myNum = 13;
s1.myLetter = 'B';

s2.myNum = 20;
s2.myLetter = 'C';

如何在结构体中使用字符串?

请记住,C 语言中的字符串实际上是字符数组,不幸的是,您无法像这样为数组分配值:

struct MyStructure {
  int myNum;
  char myLetter;
  char myString[30]; // 字符串
};

int main() {
  struct MyStructure s1;

  // 尝试为字符串分配值
  s1.myString = "Some text";

  // 尝试打印值
  printf("My string: %s", s1.myString);

  return 0;
}

会发生错误:

prog.c:12:15: error: assignment to expression with array type

但是,有一个解决办法!您可以使用 strcpy() 函数并将值分配给 s1.myString,如下所示:

struct MyStructure {
  int myNum;
  char myLetter;
  char myString[30]; // 字符串
};

int main() {
  struct MyStructure s1;

  // 使用 strcpy 函数为字符串分配值
  strcpy(s1.myString, "Some text");

  // 打印值
  printf("My string: %s", s1.myString);

  return 0;
}

结果:

My string: Some text

更简单的语法

您也可以在声明时为结构体变量的成员分配值,只需一行。

只需在花括号 {} 内插入一个以逗号分隔的列表中的值。请注意,您不必使用 strcpy() 函数来为字符串值使用此技术:

// 创建结构体
struct MyStructure {
  int myNum;
  char myLetter;
  char myString[30];
};

int main() {
  // 创建一个结构体变量并为其分配值
  struct MyStructure s1 = {13, 'B', "Some text"};

  // 打印值
  printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);

  return 0;
}

注意:插入的值的顺序必须与结构体中声明的变量类型的顺序一致(对于 int 为 13,对于 char 为 'B',等等)。

C 语言中的枚举 (enum)

枚举 (enum) 是一种特殊类型,用于表示一组常量(不可更改的值)。

要创建枚举,请使用 enum 关键字,后跟枚举的名称,并用逗号分隔枚举项:

enum Level {
  LOW,
  MEDIUM,
  HIGH
};

注意,最后一个项目不需要逗号。

使用大写字母不是必需的,但通常被认为是良好的实践。

Enum 是“enumerations”的缩写,意为“特别列出”。

要访问枚举,您必须创建一个变量。

在 main() 方法中,指定 enum 关键字,后跟枚举的名称 (Level) 和枚举变量的名称 (myVar):

enum Level myVar;

现在您已创建了一个枚举变量 (myVar),可以为其分配一个值。

分配的值必须是枚举中的项目之一 (LOW、MEDIUM 或 HIGH):

enum Level myVar = MEDIUM;

默认情况下,第一个项目 (LOW) 的值为 0,第二个 (MEDIUM) 的值为 1,依此类推。

如果现在尝试打印 myVar,它将输出 1,表示 MEDIUM:

int main() {
  // 创建一个枚举变量并为其分配一个值
  enum Level myVar = MEDIUM;

  // 打印枚举变量
  printf("%d", myVar);

  return 0;
}

更改值

如您所知,枚举的第一个项目的值为 0。 第二个值为 1,依此类推。

为了使值更易于理解,您可以轻松地更改它们:

enum Level {
  LOW = 25,
  MEDIUM = 50,
  HIGH = 75
};
printf("%d", myVar); // 现在输出 50

请注意,如果您为一个特定项目分配值,则下一个项目将相应地更新其编号:

enum Level {
  LOW = 5,
  MEDIUM, // 现在为 6
  HIGH // 现在为 7
};

枚举在 switch 语句中

枚举通常在 switch 语句中使用,以检查相应的值:

enum Level {
  LOW = 1,
  MEDIUM,
  HIGH
};

int main() {
  enum Level myVar = MEDIUM;

  switch (myVar) {
    case 1:
      printf("Low Level");
      break;
    case 2:
      printf("Medium level");
      break;
    case 3:
      printf("High level");
      break;
  }

  return 0;
}

为什么和何时使用枚举?

枚举用于为常量命名,这使代码更易于阅读和维护。

当您拥有不会改变的值时,例如月天、日、颜色、纸牌等等,请使用枚举。

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

点赞
收藏
评论区
推荐文章
CuterCorley CuterCorley
3年前
C语言入门系列之10.结构体和共用体
一个国家IT技术最被寄予厚望的人,就是这个国家的程序员,是心中有梦想、眼里有希望,致敬最可爱、最可敬的年轻一代程序猿和程序媛。奔涌吧,程序员们,和1000万程序员一起,让中国变得更强。一、结构体变量的基本使用1.概述引入:有时需要将不同类型的数据组合成一个有机的整体,以便于引用。例如,一个学生有学号、姓名、性别、年龄、地址等属性,需要定义
Wesley13 Wesley13
3年前
go 语言结构体
转自:http://qingkechina.blog.51cto.com/5552198/1671463当我第一次接触到C语言时,就对结构体投入了极大的兴趣,认为这个东西以后大有作为,后来接触Java、C,面向对象编程中的对象进入我的视线,经过了这么多年的磨练,回过头来再看结构体依旧是那么亲切;同时从另一个角度上看结构体与面向对象中的成员对象
Wesley13 Wesley13
3年前
DLL 函数中使用结构体指针作函数参数(C# 调用 C++ 的 DLL)
存在的问题:问题1:C与C同样定义的结构体在内存布局上有时并不一致;问题2:C中引入了垃圾自动回收机制,其垃圾回收器可能会重新定位指针所指向的结构体变量。解决方案:问题1方案:强制指定C、C结构体的内存布局,使其一致(两者都固定为:结构体的成员按其声明时出现的顺序依次布局,结构体成员的内存对齐为1字节对齐);为题
Stella981 Stella981
3年前
Dalvik虚拟机java方法执行流程和Method结构体分析
Method结构体是啥?在Dalvik虚拟机内部,每个Java方法都有一个对应的Method结构体,虚拟机根据此结构体获取方法的所有信息.Method结构体是怎样定义的?此结构体在不同的android版本稍有变化,但是结构体前面比较重要的一部分(从clazz到nativeFunc)完全没有变化.以下是android4.4.2\_r2的Me
Wesley13 Wesley13
3年前
C 语言结构体,以点号开头
structcgroup_subsyscpuacct_subsys{.name"cpuacct",.createcpuacct_create,.destroycpuacct_destroy,.populatecpuacct_populate,.subsys_
Stella981 Stella981
3年前
Rust 入门 (五)
定义并介绍结构体结构体和我们前面学习的元组类似,结构体中的每一项都可以是不同的数据类型。和元组不同的地方在于,我们需要给结构体的每一项命名。结构体较元组的优势是:我们声明和访问数据项的时候不必使用索引,可以直接使用名字。声明结构体我们直接看一个结构体的例子:structUser{user
Easter79 Easter79
3年前
Systemverilog for design 笔记(四)
转载请标明出处数组、结构体和联合体1. 结构体(struct)1.1. 结构体声明结构体默认是变量,也可以声明为线网varstruct {//通过var进行结构体变量声明logic\31:0\a,b;
Wesley13 Wesley13
3年前
C#
结构体概念  在C中,结构体是值类型,一般适用于表示类似Point、Rectangle、Color的对象  值类型能够降低对堆的管理、使用。降低垃圾回收,表现出更好的性能。可是值类型也有不好的一面。会涉及到装箱拆箱等操作结构体声明  结构体声明定义了一种新的数据类型,这个数据类型可以为程序包含一个以上的成员变量
Easter79 Easter79
3年前
Swift讲解专题十一——属性
Swift讲解专题十一——属性一、引言      属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算属性用于计算一个值,其可以用于类,结构体和枚举。二、存储属性      存储属性使用变量或者常量来存储一个
小万哥 小万哥
7个月前
Go 语言中结构体的使用和示例
结构体(简称struct)用于创建不同数据类型的成员集合,放入一个单一的变量中。虽然数组用于将相同数据类型的多个值存储在单一变量中,但结构体用于将不同数据类型的多个值存储在单一变量中。结构体对于将数据组合在一起以创建记录非常有用。声明结构体要在Go中声明一