C 教程

C 教程 C 语言简介 C 下载安装和环境配置 C 快速入门 C 语法 C 输出 C 注释 C 变量 C 数据类型 C 常量 C 运算符 C 布尔值 C If...Else 语句 C Switch 语句 C While 循环 C For 循环 C Break/Continue 语句 C 数组 C 字符串 C 用户输入 C 内存地址 C 指针

C 函数

C 函数 C 函数参数 C 作用域 C 函数声明 C 递归 C 数学函数

C 文件

C 创建文件 C 写入文件 C 读取文件

C 结构体

C 结构体 C 嵌套结构体 C 结构体和指针 C 联合体 C typedef

C 枚举

C 枚举

C 内存

C 内存管理

C 错误

C 错误 C 调试 C 空值 C 错误处理 C 输入验证

C 更多

C 日期 C 随机数 C 宏 C 代码组织 C 存储类 C 位运算符 C 固定宽度整数

C 项目

C 项目

C 参考资料

C 参考资料 C 关键词 C <stdio.h> C <stdlib.h> C <string.h> C <math.h> C <ctype.h> C <time.h>

C 标准库参考

C 标准库 - 参考手册 C 标准库 - <assert.h> C 标准库 - <ctype.h> C 标准库 - <errno.h> C 标准库 - <float.h> C 标准库 - <limits.h> C 标准库 - <locale.h> C 标准库 - <math.h> C 标准库 - <setjmp.h> C 标准库 - <signal.h> C 标准库 - <stdarg.h> C 标准库 - <stddef.h> C 标准库 - <stdio.h> C 标准库 - <stdlib.h> C 标准库 - <string.h> C 标准库 - <time.h>

C 实例

C 语言实例 C 经典100例 C 编译器 C 测验


C 结构体(structs)

结构体

结构体(也称struct)是一种将多个相关变量组合在一起的方法。

结构体中的每个变量都称为该结构体的成员。

与数组不同,一个结构体可以包含多种不同的数据类型(例如 int、float、char 等)。


创建结构体

您可以使用 `struct` 关键字创建结构体,并在花括号内声明其每个成员:

struct MyStructure {   // 结构声明
  int myNum;           // Member (int variable)
  char myLetter;       // Member (char variable)
}; // 以分号结束该结构。

要访问该结构体,必须创建一个包含该结构的变量。

在 main() 方法中使用 struct 关键字,然后是结构体的名称,最后是结构体变量的名称:

创建一个名为"s1"的结构体变量:

struct myStructure {
  int myNum;
  char myLetter;
};

int main() {
  struct myStructure s1;
  return 0;
}

访问结构体成员

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

示例

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

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

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

  // 打印值
  printf("My number: %d", s1.myNum);
  printf("My letter: %c", 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];  // String
};

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]; // String
};

int main() {
  struct myStructure s1;

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

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

  return 0;
}

结果:

My string: Some text
亲自试一试 »

更简洁的语法

您还可以在声明结构体变量时,用一行代码为其成员赋值。

只需将值以逗号分隔的形式放在花括号 {} 内即可。请注意,使用此方法,您无需对字符串值使用 strcpy() 函数。

示例

// Create a structure
struct myStructure {
  int myNum;
  char myLetter;
  char myString[30];
};

int main() {
  // Create a structure variable and assign values to it
  struct myStructure s1 = {13, 'B', "Some text"};

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

  return 0;
}
亲自试一试 »

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


复制结构体

您还可以将一个结构体赋值给另一个结构体。

在以下示例中,s1 的值被复制到 s2:

示例

struct myStructure s1 = {13, 'B', "Some text"};
struct myStructure s2;

s2 = s1;
亲自试一试 »

修改值

如果您想更改/修改某个值,可以使用点语法(.")。

要修改字符串值,strcpy() 函数再次派上用场:

示例

struct myStructure {
  int myNum;
  char myLetter;
  char myString[30];
};

int main() {
  // Create a structure variable and assign values to it
  struct myStructure s1 = {13, 'B', "Some text"};

  // Modify values
  s1.myNum = 30;
  s1.myLetter = 'C';
  strcpy(s1.myString, "Something else");

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

  return 0;
}
亲自试一试 »

复制结构体值时,修改值尤其有用:

示例

// 创建一个结构体变量并为其赋值。
struct myStructure s1 = {13, 'B', "Some text"};

// 创建另一个结构变量
struct myStructure s2;

// 将 s1 中的值复制到 s2
s2 = s1;

// 更改 s2 值
s2.myNum = 30;
s2.myLetter = 'C';
strcpy(s2.myString, "Something else");

// 打印值
printf("%d %c %s", s1.myNum, s1.myLetter, s1.myString);
printf("%d %c %s", s2.myNum, s2.myLetter, s2.myString);
亲自试一试 »

好的,那么,结构体有什么用呢?

假设你需要编写一个程序来存储关于汽车的各种信息,例如品牌、型号和年份。结构体的优势在于,你可以创建一个"汽车模板",并将其用于你创建的每一辆汽车。请看下面的实际示例。


真实案例

使用结构体存储关于汽车的各种信息:

示例

struct Car {
  char brand[30];
  char model[30];
  int year;
};

int main() {
  struct Car car1 = {"BMW", "X5", 1999};
  struct Car car2 = {"Ford", "Mustang", 1969};
  struct Car car3 = {"Toyota", "Corolla", 2011};

  printf("%s %s %d", car1.brand, car1.model, car1.year);
  printf("%s %s %d", car2.brand, car2.model, car2.year);
  printf("%s %s %d", car3.brand, car3.model, car3.year);

  return 0;
}
亲自试一试 »