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。
修改值
如果要更改/修改值,可以使用点语法 (.
)。
要修改字符串值,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;
}
自己试试 »