结构体
目的:为了解决存储同一个对象拥有不同类型属性的问题。
声明结构体:
关于成员:
总的来说:
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 }