进阶知识:自定义类型详解(结构体+枚举+联合)
- #include
-
- // 描述一个学生
- // struct --结构体关键字
- // stu --结构体标签
- // struct stu --结构体类型
- // 结构体声明是一条语句,所以分号必不可少
-
- // 结构体声明
- struct stu
- {
- char name[20];
- short age;
- char tele[12];
- char sex[5];
- } s1, s2, s3; // s1, s2, s3是三个全局的结构体变量
- // 尽量少用全局变量
-
- int main()
- {
- struct stu s; // s为局部变量
- return 0;
- }
- typedef struct stu
- {
- char name[20];
- short age;
- char tele[12];
- char sex[5];
- } STU; //给结构体重新起个名字叫STU,通过STU创建结构体变量
-
- int main()
- {
- // struct stu s; // s为局部变量
- STU s; // 功能与上相同
- return 0;
- }
这两种定义结构体的方法,选用哪一种都可以
- #include
-
- typedef struct stu
- {
- char name[20];
- short age;
- char tele[12];
- char sex[5];
- } STU; //给结构体重新起个名字叫STU,通过STU创建结构体变量
-
- int main()
- {
- STU s1 = {"张三",20,"123456789","男"};
- struct stu s2 = {"张三",20,"123456789","男"};
- return 0;
- }
结构体嵌套(重要)
- struct S
- {
- int a;
- char arr[20];
- double d;
- };
- struct T
- {
- char ch[10];
- struct S s;
- char *pc;
- };
-
- int main()
- {
- char arr[] = "bit";
- struct T t = {"123", {100, "hello", 3.14}, arr}; // 数组名为首元素的地址,传递给指针
- printf("%s\n", t.ch);
- printf("%s\n", t.s.arr);
- return 0;
- }
- #include
-
- typedef struct stu
- {
- char name[20];
- short age;
- char tele[12];
- char sex[5];
- } STU;
- STU s = {"张三", 20, "312654", "男"};
-
- //结构体传参
- void Print1(STU temp)
- {
- printf("%s\n", temp.name);
- printf("%d\n", temp.age);
- }
-
- //结构体传址
- void Print2(STU *temp)
- {
- printf("%s\n", temp->name);
- printf("%d\n", temp->age);
- }
-
- int main()
- {
- Print1(s);
- Print2(&s);
- return 0;
- }
函数传参时,首选Print2的方法,在传参时,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
总结:结构体传参的时候,要传结构体的地址。
调试的基本步骤