菜单
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP 如何 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)


结构体

结构体(也称为 struct)是一种将几个相关变量组合到一个地方的方式。结构体中的每个变量都称为结构体的成员

数组不同,结构体可以包含许多不同的数据类型(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: 赋值给数组类型表达式
自己动手试一试 »

但是,对此有一个解决方案!您可以使用 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;
}

结果

我的字符串:一些文本
自己动手试一试 »

更简单的语法

您还可以在声明时在单行中为结构体变量的成员赋值。

只需将值以逗号分隔的列表形式插入花括号 {} 中。请注意,使用此技术时,您不必为字符串值使用 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 {
  char brand[50];
  char model[50];
  int year;
};

开始练习



×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持