结构体

目的:为了解决存储同一个对象拥有不同类型属性的问题。

声明结构体:

 

 

 关于成员:

 

 

 总的来说:

1.结构体成员==结构体包含的变量

2.允许结构体内再嵌套系欸沟通

成员的注意事项和细节:

 

 

 关于第三点:

 

 

 运行上面的程序会异常终止!


 

小例子:

 

 

 结构体与结构体变量的关系:

 

 

 其中,成员内包含了:名字、年龄、颜色。

 1 #include <stdio.h>
 2 
 3 void main(){
 4     //分析:
 5     //猫有三个成员(变量)组成
 6     //采用结构体
 7 
 8     //创建结构体cat(结构体是一种数据类型,属于其中的构造类型)
 9     struct Cat{ //结构体名:Cat,Cat是我们自己构造的一个数据类型
10         char* name; //名字,指针,指向一个字符串
11         int age;    //年龄
12         char* color;    //颜色,指针,指向一个字符串
13     };
14     //使用Cat结构体创建变量
15     struct Cat cat1;    //cat1是struct Cat的一个变量
16     struct Cat cat2;    //cat2是struct Cat的一个变量
17     //给cat1的各个成员赋值
18     cat1.name = "小白";
19     cat1.age = 3;
20     cat1.color = "";
21 
22     //给cat2的各个成员赋值
23     cat2.name = "小花";
24     cat2.age = 5;
25     cat2.color = "";
26 
27     //输出俩只猫信息
28     printf("\n 第一只猫:name=%s, age=%d, color=%s", cat1.name, cat1.age, cat1.color);
29     printf("\n 第二只猫:name=%s, age=%d, color=%s", cat2.name, cat2.age, cat2.color);
30 }

结构体和结构体变量的区别和联系:

 

 

 内存布局(至于是保存在堆里还是栈里,看自己如何去定义):


结构体的三种定义方式:

1.先定义结构体,再创建结构体变量:

 

 

 2.定义结构体的同时定义结构体变量:

 

 

 3.如果只需要使用定义好的变量(如此处的stu1和stu2),后面不在需要使用结构体数据类型来定义其他变量,在定义时也可以不给出结构体名:


成员获取和赋值:

 

 

 例子1:

 

 

 例子2:

 

 

 但是不允许这样赋值:


实战1:

 1 #include <stdio.h>
 2 
 3 //定义一个Dog结构体
 4 struct Dog{
 5     char* name;
 6     int age;
 7     double weight;
 8 };
 9 
10 //say函数
11 char *say(struct Dog dog){
12     //把信息放入一个字符数组/字符串中
13     static char info[50];   //需要为局部静态变量
14     sprintf(info, "name=%s age=%d weight=%.2f", dog.name, dog.age, dog.weight);
15     dog.name = "小花";  //不会影响,因为是返回info的信息,修改Dog结构体dog变量的副本不影响最终输出结果
16     return info;
17 }
18 
19 void main(){
20     //定义结构体变量
21     struct Dog dog;
22     char *info = NULL;
23     dog.name = "你好";
24     dog.age = 1;
25     dog.weight = 3.4;
26     info = say(dog);    //结构体变量是默认值传递(区别地址传递)
27     printf("\n小狗信息:%s", info);
28     printf("\nmain小狗名字=%s", dog.name);
29 }

实战2:

 1 #include <stdio.h>
 2 
 3 struct Box{
 4     double x;
 5     double y;
 6     double z;
 7 };
 8 
 9 // void volume(struct Box *box){
10 //     double vol;
11 //     vol = (*box).x * (*box).y * (*box).z;
12 //     printf("输入的立方体体积为:%.2f", vol);
13 // }
14 
15 // void main(){
16 //     struct Box box;
17 //     printf("请输入立方体的长:");
18 //     scanf("%lf", &box.x);
19 //     getchar();
20 //     printf("请输入立方体的宽:");
21 //     scanf("%lf", &box.y);
22 //     getchar();
23 //     printf("请输入立方体的高:");
24 //     scanf("%lf", &box.z);
25 //     getchar();
26 //     volume(&box);
27 // }
28 
29 double volume(struct Box box){
30     static double vol;
31     vol = box.x * box.y * box.z;
32     return vol;
33 }
34 
35 void main(){
36     struct Box box;
37     printf("请输入立方体的长:");
38     scanf("%lf", &box.x);
39     getchar();
40     printf("请输入立方体的宽:");
41     scanf("%lf", &box.y);
42     getchar();
43     printf("请输入立方体的高:");
44     scanf("%lf", &box.z);
45     getchar();
46     double vol = volume(box);
47     printf("输入的立方体体积为:%.2f", vol);
48 }

如果遇到输入输出问题,请留意scanf接收数据的格式化符号:%lf

本案例提供了普通传值和地址传值两种方式。

案例3:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 struct Visitor{
 5     char name[10];
 6     int age;
 7     double pay;
 8 };
 9 
10 void ticket(struct Visitor *visitor){
11     if((*visitor).age > 18){
12         (*visitor).pay = 20;
13     }else{
14         (*visitor).pay = 0;
15     }
16 }
17 
18 void main(){
19     struct Visitor visitor;
20     while(1){
21         printf("\n请输入名字:");
22         scanf("%s", visitor.name);
23         if(!strcmp("n", visitor.name)){
24             break;
25         }
26         
27         printf("\n请输入年龄:");
28         scanf("%d", &visitor.age);
29 
30         ticket(&visitor);
31         printf("\n该游客应付票价=%.2f", visitor.pay);
32     }
33     printf("退出程序!");
34 }

 

posted @ 2022-10-17 18:16  Morning枫  阅读(121)  评论(0编辑  收藏  举报