学校网站建设需求分析调研表,网站建设分解结构,电商网站开发费用,wordpress 萌化目录 一 结构体类型的声明
1.结构体回顾
(1)结构的声明
(2)结构体变量的创建和初始化
2.结构的特殊声明
3.结构的⾃引⽤
4. 结构体内存对⻬
(1)对⻬规则
5. 结构体传参 一 结构体类型的声明
1.结构体回顾
结构是⼀些值的集合#xff0c;这些值称为成员变量。结构的每…目录一 结构体类型的声明1.结构体回顾(1)结构的声明(2)结构体变量的创建和初始化2.结构的特殊声明3.结构的⾃引⽤4. 结构体内存对⻬(1)对⻬规则5. 结构体传参一 结构体类型的声明1.结构体回顾结构是⼀些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量。(1)结构的声明例如描述⼀个学⽣#define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h int main() { struct Student { char name[20];//姓名 int age;//年龄 char sex[10];//性别 }; return 0; }(2)结构体变量的创建和初始化#define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h int main() { struct Student { char name[20];//姓名 int age;//年龄 char sex[10];//性别 }; struct Student a { 张三,18,男 }; printf(%s\n, a.name); printf(%d\n, a.age); printf(%s\n, a.sex); return 0; }这是按照我们创建的结构体的顺序进行初始化的,下面我再来介绍另一种的初始化的方式;#define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h int main() { struct Student { char name[20];//姓名 int age;//年龄 char sex[10];//性别 }; struct Student a { .age 18,.name 张三,.sex 男 }; printf(%s\n, a.name); printf(%d\n, a.age); printf(%s\n, a.sex); return 0; }2.结构的特殊声明在声明结构的时候可以不完全的声明。例如:#define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h int main() { struct { char name[20];//姓名 int age;//年龄 char sex[10];//性别 }a; a.age 18; /*printf(%s\n, a.name);*/ printf(%d\n, a.age); /*printf(%s\n, a.sex);*/ return 0; }上⾯的结构在声明的时候省略掉了结构体标签tag。匿名的结构体类型如果没有对结构体类型重命名的话基本上只能使⽤⼀次。3.结构的⾃引⽤在结构中包含⼀个类型为该结构本⾝的成员是否可以呢⽐如定义⼀个链表的节点struct NODE { int x; struct NODE next; };这样的代码行得通吗?如果正确那 sizeof(struct Node) 是多少仔细分析其实是不⾏的因为⼀个结构体中再包含⼀个同类型的结构体变量这样结构体变量的⼤ ⼩就会⽆穷的⼤是不合理的。正确的方式:struct NODE { int x; struct NODE* next; };在结构体⾃引⽤使⽤的过程中夹杂了 typedef 对匿名结构体类型重命名也容易引⼊问题看看 下⾯的代码可⾏吗typedef struct NODE { int x; NODE* next; }NODE;我们可以看到这里的报错说明这样的写法是错误的,因为NODE是对前⾯的匿名结构体类型的重命名产⽣的但是在匿名结构体内部提前使 ⽤NODE类型来创建成员变量这是不⾏的。4.结构体内存对⻬我们已经掌握了结构体的基本使⽤了。现在我们深⼊讨论⼀个问题计算结构体的⼤⼩。这也是⼀个特别热⻔的考点结构体内存对⻬(1)对⻬规则⾸先得掌握结构体的对⻬规则1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处2.其他成员变量要对⻬到某个数字对⻬数的整数倍的地址处。对⻬数编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。-VS 中默认的值为 8-Linux中gcc没有默认对⻬数对⻬数就是成员⾃⾝的⼤⼩;3.结构体总⼤⼩为最⼤对⻬数结构体中每个成员变量都有⼀个对⻬数所有对⻬数中最⼤的的 整数倍。4.如果嵌套了结构体的情况嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处结构 体的整体⼤⼩就是所有最⼤对⻬数含嵌套结构体中成员的对⻬数的整数倍。这样听起来很难理解.下面列举个例子:#define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h int main() { struct S1 { char c1; int i; char c2; }; printf(%d\n, sizeof(struct S1)); struct S2 { char c1; char c2; int i; }; printf(%d\n, sizeof(struct S2)); return 0; }我们定义的两个结构体内部的数据的类型相同,只不过顺序不同,那么他们的大小也应该相同.但是事实真是这样吗?运行结果如图所示:为什么是这样的结果?我们来按照对齐规则来逐步解释下面我们取出较小值:所以第一个结构体的大小是12.5. 结构体传参struct S { int data[1000]; int num; }; struct S s {{1,2,3,4}, 1000}; //结构体传参 void print1(struct S s) { printf(%d\n, s.num); } //结构体地址传参 void print2(struct S* ps) { printf(%d\n, ps-num); } int main() { print1(s); //传结构体 print2(s); //传地址 return 0; }上⾯的 print1 和 print2 函数哪个好些答案是⾸选print2函数。原因 函数传参的时候参数是需要压栈会有时间和空间上的系统开销。如果传递⼀个结构体对象的时候结构体过⼤参数压栈的的系统开销⽐较⼤所以会导致性能的下 降。结论 结构体传参的时候要传结构体的地址。结构体的内容就结束了.谢谢大家的观看.之后我会讲解联合体和枚举的相关语法知识.