C++ 结构(Struct)

一、结构介绍

        C语言中的结构(Structure)是一种用户自定义的复合数据类型,用于将不同类型的数据组合成一个单一的实体。结构允许您在一个数据结构中存储多个不同类型的数据,这些数据可以通过结构的成员来访问。

        以下是结构类型的数据

        

上面这一串结构类型虽然很长,但其就相当于 int 类型一样。 如同在 int 后填变量名可以声明一个整型变量。 ,在结构类型后面填写变量名可以声明一个 结构变量
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 { 之间可以填写一个 结构别名 。若以后再次需要使用这种结 构,仅需要使用 struct 别名 即可声明这种结构的变量。
如下图代码,声明一次结构体并取 person 为其别名,在需要多次调用结构体时,只需要 struct+person+变量名
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);

和正常指针一样,加上星号 * 用于声明一个指针。使用取地址运算符&,可以获取指针。

使用指向结构的指针时,由于取地址 & 与取值 * 它们具有可逆关系,我们可以把指针先转为结构再使用。由于 成员运算符 . 的优先级高于取值 * ,为避免出现错误,需要将 *pTimmy 用()括起来。

另外,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。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘洲青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值