C语言-06复杂数据类型-04 结构体
结构体的说明(构造类型)
数组:只能由多个相同类型的数据构成
结构体:可以由多个不同类型的数据构成 ,结构体的类型是不存在的,自己定义
int main() { // 1.定义结构体类型 定义类型的时候是没有分配内存的 struct Person { // 里面的3个变量,可以称为是结构体的成员或者属性 int age; // 年龄 double height; // 身高 char *name; // 姓名 }; //注意分号 // 1.定义结构体类型 struct Person p = {20, 1.55, "jack"}; p.age = 30; p.name = "rose"; printf("age=%d, name=%s, height=%f\n", p.age, p.name, p.height); /* 错误写法 struct Person p2; p2 = {30, 1.67, "jake"}; */ struct Person p2 = {.height = 1.78, .name="jim", .age=30}; //p2.age = 25; return 0; }
1.定义结构体变量的3种方式 1> 先定义类型,再定义变量(分开定义) struct Student { int age; }; struct Student stu; 2> 定义类型的同时定义变量 struct Student { int age; } stu; struct Student stu2; 3> 定义类型的同时定义变量(省略了类型名称)//无法重用 struct { int age; } stu;
结构体数组
int main() { struct RankRecord { int no; // 序号 4 char *name; // 名称 8 int score; // 积分 4 }; /* struct RankRecord r1 = {1, "jack", 5000}; struct RankRecord r2 = {2, "jim", 500}; struct RankRecord r3 = {3, "jake",300}; */ struct RankRecord records[3] = { {1, "jack", 5000}, {2, "jim", 500}, {3, "jake",300} }; for (int i = 0; i<3; i++) { printf("%d\t%s\t%d\n", records[i].no, records[i].name, records[i].score); } return 0; }
指向结构体的指针
#include <stdio.h> /* 1.指向结构体的指针的定义 struct Student *p; 2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 */ int main() { struct Student { int no; int age; }; // 结构体变量 struct Student stu = {1, 20}; // 指针变量p将来指向struct Student类型的数据 struct Student *p; // 指针变量p指向了stu变量 p = &stu; p->age = 30; // 第一种方式 printf("age=%d, no=%d\n", stu.age, stu.no); // 第二种方式 printf("age=%d, no=%d\n", (*p).age, (*p).no); // 第三种方式 是比较常用的 printf("age=%d, no=%d\n", p->age, p->no); return 0; }
结构体和函数
#include <stdio.h> struct Student { int age; int no; }; // 如果结构体作为函数参数,只是将实参结构体所有成员的值对应地赋值给了形参结构体的所有成员 // 修改函数内部结构体的成员不会影响外面的实参结构体 void test(struct Student s) { s.age = 30; s.no = 2; } // 会影响外面的实参结构体 void test2(struct Student *p) { p->age = 15; p->no = 2; } void test3(struct Student *p) { struct Student stu2 = {15, 2}; p = &stu2; p->age = 16; p->no = 3; } int main() { struct Student stu = {28, 1}; //test(stu); //test2(&stu); test3(&stu); printf("age=%d, no=%d\n", stu.age, stu.no); return 0; }
结构体的嵌套定义
#include <stdio.h> int main() { struct Date { int year; int month; int day; }; // 类型 struct Student { int no; // 学号 struct Date birthday; // 生日 struct Date ruxueDate; // 入学日期 // 这种写法是错误的 //struct Student stu; }; struct Student stu = {1, {2000, 9, 10}, {2012, 9, 10}}; printf("year=%d,month=%d,day=%d\n", stu.birthday.year, stu.birthday.month, stu.birthday.day); return 0; }
枚举
#include <stdio.h> int main() { enum Sex { Man, Woman, Unkown}; // 0男 1女 -1不详 //int sex = 3; //enum Sex s = Unkown; // 1.定义枚举类型 enum Season { spring = 1, summer, //枚举中的值其实都是整型的常量 从0开始 也可以自定义开始值 autumn, winter }; // 2.定义枚举变量 enum Season s = 100000; //c语言是弱类型语言,枚举不正确的值不会报错 printf("%d\n", s); //输出的是整型常量 return 0; }