Menu
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

C 结构体 (structs)


结构体

结构体(也称为 structs)是将多个相关变量组合到一个地方的方式。结构体中的每个变量被称为结构体的 **成员**。

数组 不同,结构体可以包含许多不同的数据类型(int、float、char 等)。


创建结构体

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

struct MyStructure {   // 结构体声明
  int myNum;           // 成员(int 变量)
  char myLetter;       // 成员(char 变量)
}; // 用分号结束结构体

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

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() {
  // 创建一个名为 **s1** 的 myStructure 结构体变量
  struct myStructure s1;

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

  // 打印值
  printf("我的数字:%d\n", s1.myNum);
  printf("我的字母:%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("我的字符串:%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("我的字符串:%s", s1.myString);

  return 0;
}

结果

我的字符串: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;
}
自己试试 »

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


复制结构体

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

在以下示例中,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() {
  // 创建一个结构体变量并为其赋值
  struct myStructure s1 = {13, 'B', "Some text"};

  // 修改值
  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\n", s1.myNum, s1.myLetter, s1.myString);
printf("%d %c %s\n", s2.myNum, s2.myLetter, s2.myString);
自己试试 »

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

假设您要编写一个程序来存储有关汽车的不同信息,例如品牌、型号和年份。结构体很棒的一点是,您可以创建一个“汽车模板”,然后将其用于您创建的每辆汽车。请参见下面的真实案例。


真实案例

使用结构体存储有关汽车的不同信息。

示例

struct Car {
  char brand[50];
  char model[50];
  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\n", car1.brand, car1.model, car1.year);
  printf("%s %s %d\n", car2.brand, car2.model, car2.year);
  printf("%s %s %d\n", car3.brand, car3.model, car3.year);

  return 0;
}
自己试试 »

C 练习

通过练习测试自己

练习

填写缺失部分以创建 Car 结构体

 Car {
  char brand[50];
  char model[50];
  int year;
};

开始练习



×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.