一、结构介绍
C语言中的结构(Structure)是一种用户自定义的复合数据类型,用于将不同类型的数据组合成一个单一的实体。结构允许您在一个数据结构中存储多个不同类型的数据,这些数据可以通过结构的成员来访问。
以下是结构类型的数据
struct {
char name[20];
int gender;
double height;
double weight;
}timmy;
如在上述代码中,timmy 是由该结构声明的变量,它由4个成员组成。
使用成员运算符 . 加上 字段名 可以访问到结构的各个成员。
// 将Timmy的数据装入结构变量
strcpy(timmy.name, "Timmy");
timmy.gender = 1;
timmy.height = 170.00;
timmy.weight = 60;
// 从结构变量中显示Timmy的数据
printf("%s\n", timmy.name);
printf("%d\n", timmy.gender);
printf("%.2f\n", timmy.height);
printf("%.2f\n", timmy.weight);
1.1、结构体别名
struct {
char name[20];
int gender;
double height;
double weight;
}david;
struct {
char name[20];
int gender;
double height;
double weight;
}jane;
struct person{
char name[20];
int gender;
double height;
double weight;
}timmy;
struct person david;
struct person jane;
1.2、结构体初始化
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
struct person{
char name[20];
int gender;
double height;
double weight;
};
//结构体初始化
struct person timmy = {"timmy", 1, 170.00, 60.00};
- 初始化列表由花括号包括。
- 花括号内为结构成员需要被初始化的值。
- 初始化值按照结构成员声明时的顺序依次排列
- 每个初始化值之间由逗号分隔。
1.3、结构数组
结构数组与基本变量数组类似,使用方括号内填数组元素个数进行声明。
初始化列表也可用于初始化结构数组,初始化列表中依次填每个结构的初始化列表,每个结构的初始化列表之间由逗号分隔。
struct person{
char name[20];
int gender;
double height;
double weight;
};
struct person people[3] = {
{"timmy", 1, 170.00, 60.00},
{"david", 1, 175.00, 65.00},
{"jane", 2, 165.00, 55.00}
};
1.4、嵌套结构
struct contact {
char phone[20];
char email[20];
};
struct person{
char name[20];
int gender;
double height;
double weight;
struct contact c;
};
//初始化
struct person timmy = {
"timmy", 1, 170.00, 60.00, {"130123456678", "timmy@xxx.com"}
};
若想访问 结构 timmy中的 结构 contact里面的相关参数(phone、email),可以使用timmy.contact.phone的形式访问。如需打印出phone、 mail数据可参考下列操作
printf("%s\n", timmy.c.phone);
printf("%s\n", timmy.c.email);
1.5、指向结构的指针
指针可以指向基本类型数据也可以指向数组,结构也同样可以指向。
struct person{
char name[20];
int gender;
double height;
double weight;
};
struct person timmy = {"timmy", 1, 170.00, 60.00};
struct person *pTimmy = &timmy;
printf("%s\n", (*pTimmy).name);
printf("%d\n", (*pTimmy).gender);
printf("%.2f\n", (*pTimmy).height);
printf("%.2f\n", (*pTimmy).weight);
和正常指针一样,加上星号 * 用于声明一个指针。使用取地址运算符&,可以获取指针。
另外,C语言中提供了更加方便的写法,即使用成员间接运算符 -> 。pTimmy->name等价于(*pTimmy).name 。
printf("%s\n", pTimmy->name);
printf("%d\n", pTimmy->gender);
printf("%.2f\n", pTimmy->height);
printf("%.2f\n", pTimmy->weight);
1.6、结构在函数中传递
struct person{
char name[20];
int gender;
double height;
double weight;
};
void change(struct person per)
{
strcpy(per.name, "david");
per.gender = 1;
per.height = 175.00;
per.weight = 65.00;
}
int main()
{
struct person timmy = {"timmy", 1, 170.00, 60.00};
change(timmy);
printf("%s\n", timmy.name);
printf("%d\n", timmy.gender);
printf("%.2f\n", timmy.height);
printf("%.2f\n", timmy.weight);
return 0;
}
从上面的结果来看, 将结构当作参数传入函数。在函数内部修改传入的参数。 很显然,由于实参 timmy 与实参 per 是相互独立的。修改函数 change 内的 per 无法改动实参 timmy。
struct person{
char name[20];
int gender;
double height;
double weight;
};
void change(struct person *per)
{
strcpy(per->name, "david");
per->gender = 1;
per->height = 175.00;
per->weight = 65.00;
}
int main()
{
struct person timmy = {"timmy", 1, 170.00, 60.00};
change(&timmy);
printf("%s\n", timmy.name);
printf("%d\n", timmy.gender);
printf("%.2f\n", timmy.height);
printf("%.2f\n", timmy.weight);
return 0;
}
从上图结果看,如果将 change 函数的参数改为指向结构的指针,情况就大不相同了。在函数 change 内部可以通过指针,找到结构变量 timmy 。并且对其进行修改。最后,将一个结构从函数返回也是可以的。从函数返回了david的数据,并且在将其赋值给了timmy。