第十一章 结构体

结构

  • 定义:
    • 结构是一种构造数据类型,由若干数据项组合而成
1
2
3
4
5
6
struct StructName
{
//结构成员
DataType var1;
DataType var2;
};
  • 注意:

    1、结构定义并不预留内存

    2、结构定义一般放在程序的开始部分(头文件声明之后)

    3、结构定义仅用来描述结构的形式,使用结构需要声明结构变量

使用结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Hero
{
int id;
char name[50]; //英雄的名称
int level; //英雄的等级
int hp; //英雄的血量
int mp; //英雄的魔法值
char skill[50]; //英雄的技能
};
struct Hero2
{
int id;
char* name; //英雄的名称
int level; //英雄的等级
int hp; //英雄的血量
int mp; //英雄的魔法值
char skill[50]; //英雄的技能
};
int main()
{
//使用结构体
struct Hero2 hero1 = { 2,"祥林嫂",10,1000,200,"疯狂呢喃" };//跳跃赋值可用: .skill="疯狂呢喃"
printf("请输入英雄的名称:");
hero1.name = (char*)malloc(50);
scanf_s("%s", hero1.name,50); //vs输入字符串数组时要标明大小
/*
hero1.id = 1;
strcpy(hero1.name, "德玛西亚之力");
hero1.level = 5;
hero1.hp = 500;
hero1.mp = 100;
strcpy(hero1.skill, "大宝剑");
*/
printf("%d\t%s\t%d\t%d\t%d\t%s\n", hero1.id, hero1.name, hero1.level, hero1.hp, hero1.mp, hero1.skill);
return 0;
}

使用结构2

  • 定义结构类型的同时声明结构变量
  • 直接声明结构变量
1
2
3
4
5
6
7
8
#include <stdio.h>
struct Hero
{
char * name;
int level;
char * job;
char * skill;
}jacjieChan,laola,guofurong;
1
2
3
4
5
6
7
8
#include <stdio.h>
struct //直接声明结构变量
{
char * name;
int level;
char * job;
char * skill;
}jacjieChan,laola,guofurong;

嵌套结构

1
2
3
4
5
6
7
8
struct Hero
{
char * name;
int level;
struct Birth birth;
char * job;
char * skill;
}
1
2
3
4
5
6
7
#include <stdio.h>
//表示生日:年、月、日
struct Birth{
int year;
int month;
int data;
}

指向结构的指针

  • 说明:
    • 一个指针指向结构时,称为结构指针变量
    • 结构指针变量中的值是所指向的结构变量的首地址
    • 一般形式:
      • struct 结构名称 *结构指针变量名;
    • 访问结构成员的一般形式
      • (*结构指针变量).成员变量名
      • 接哦古指针变量->成员变量名
1
2
3
4
5
struct Hero laola ={"劳拉",28,{1988,5,4},"考古学家","洛阳铲"};
struct Hero *ptr_laola;
ptr_laola = &laola;
printf("职业:%s\n",(*ptr_laola).job);
printf("职业:%s\n",ptr_laola->job);

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Martial
{
int id; //门派id
char name[50];
int count;//门派的人数
int type;//门派的类型-1正派,2中立,3邪派
};
struct Player
{
int id;
char name[50];//玩家名称
char pass[50];//玩家登录密码
char sex;//玩家性别
struct Martial martial;//玩家所属门派
};

int main()
{
//玩家Player
//玩家有所属门派(种族,阵营)
struct Player player = { 1,"盖伦","123456",'f',{1,"诺克萨斯",500,3} };//= 后面的也可以写成 player.id = 1; 来赋值
printf("%d\t%s\t%s\t%d\t%d\t%s\t%d\t%d\n", player.id, player.name, player.pass, player.sex, player.martial.id, player.martial.name, player.martial.count, player.martial.type);
struct Player player2 = { 1,"史莱姆","123456",'f',{1,"诺克萨斯",500,3} };
struct Player* ptr_player2 = &player2;
//指针访问
printf("%s\t%s\n", (*ptr_player2).name, (*ptr_player2).martial.name);
printf("%s\t%s\n", ptr_player2->name, ptr_player2->martial.name);
return 0;
}

结构数组

  • 定义:元素为结构类型的数组称为结构数组
1
2
3
4
5
6
7
struct Role
{
char * name;
int age;
char * job;
char * skill;
}roles[25];
1
2
3
4
5
6
7
8
9
10
struct Role
{
char * name;
int age;
char * job;
char * skill;
}roles[] = {
{"郭芙蓉",29,"打杂的","排山倒海"},
{"吕秀才",30,"账房","子曾经曰过"}
};

向函数传递结构的信息

  • 结构作为函数参数的三种方式
    • 1、传递结构成员
    • 2、传递结构
    • 3、传递结构的地址

传递结构成员

1
2
3
4
5
6
7
8
9
10
11
12
13
//信用卡账户
struct Account
{
char * bankName; //银行名称
char * userName; //用户名称
double limit; //账户额度
double billAmount;//当月账单
};
//计算并返回当月应还款
double GetRepayment(double m1,double m2)
{
return m1 - m2;
}
1
2
3
4
5
6
7
struct Account zsAcc;
zsAcc.bankName = "招商银行";
zsAcc.userName = "郭达斯坦森";
zsAcc.limit = 50000;
zsAcc.billAmount = 35000;
double result = GetRepayment(zsAcc.limit,zsAcc.billAmount);
printf("本月应还款:%.2lf\n",result);

传递结构

1
2
3
4
5
6
7
8
9
10
11
12
13
//信用卡账户
struct Account
{
char * bankName; //银行名称
char * userName; //用户名称
double limit; //账户额度
double billAmount;//当月账单
};
//计算并返回当月应还款
double GetRepayment(struct Account account)
{
return account.limit - account.billAmount;
}
1
2
3
4
5
6
7
struct Account zsAcc;
zsAcc.bankName = "招商银行";
zsAcc.userName = "郭达斯坦森";
zsAcc.limit = 50000;
zsAcc.billAmount = 35000;
double result = GetRepayment(zsAcc);
printf("本月应还款:%.2lf\n",result);

传递结构指针

1
2
3
4
5
6
7
8
9
10
11
12
13
//信用卡账户
struct Account
{
char * bankName; //银行名称
char * userName; //用户名称
double limit; //账户额度
double billAmount;//当月账单
};
//计算并返回当月应还款
double GetRepayment(const struct Account *account)
{
return account->limit - account->billAmount;
}
1
2
3
4
5
6
7
struct Account zsAcc;
zsAcc.bankName = "招商银行";
zsAcc.userName = "郭达斯坦森";
zsAcc.limit = 50000;
zsAcc.billAmount = 35000;
double result = GetRepayment(&zsAcc);
printf("本月应还款:%.2lf\n",result);

参数传递小结

  • 结构作为函数参数的三种方式
    • 1、传递结构成员
    • 2、传递结构
      • 优点:函数处理的是原始数据的副本,保护了原始数据
      • 缺点:老版本不支持;传递结构浪费时间和存储空间
      • 一般用来处理小型结构数据
    • 3、传递结构的地址
      • 优点:程序执行速度快,效率高
      • 缺点:无法保护数据,函数中的操作有可能会意外影响原结构中的数据
      • 为追求效率常用此方案

使用typedef简化定义代码

  • typedef:
    • 可以为某一类型自定义名称
      • typedef unsigend char Byte;
      • Byte btValue1;
1
2
3
4
5
6
7
8
9
typedef struct [hero]
{
char * name;
int age;
char * job;
char * skill;
}Hero;
//使用:
Hero hero = {"佟湘玉",35,"掌柜的","额滴神呐"};
  • 注意:typedef并没有创造任何新类型,只是为某个已存在的类型增加一个方便使用的标签
更新于

请我喝[茶]~( ̄▽ ̄)~*

Chen 微信支付

微信支付

Chen 支付宝

支付宝

Chen 贝宝

贝宝