结构体
- 结构体类型的声明
- 结构体初始化
- 结构体成员访问
- 结构体传参
现实生活中的对象大多是复杂对象,我们用简单的int,float,double是没办法描述的
结构体的声明
结构的基础支持
结构式一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量
结构的声明
语法
struct/*关键字*/ tag/*结构体标签,自定义*/{member-list/*被称为成员变量(成员列表)*/;}variable-list/*变量列表*/;
struct tag{member-list;}variable-list;
例如描述一个学生
typedef struct Stu{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号}Stu;
结构体创建
/*StuOne.c -- 以学生为例的结构体*/#include "stdio.h"//描述一个学生/*** 名字* 年龄* 电话* 性别*//*** struct: 结构体关键字* Stu: 结构体标签* struct Stu: 结构体类型*/struct Stu{//成员变量char name[60];short age;char tele[12];char sex[5];};int main(){return 0;}
结构体变量创建
int main(){struct Stu s; //局部的结构体变量return 0;}
类型->图纸
struct Stu{//成员变量char name[60];short age;char tele[12];char sex[5];}s1,s2,s3;//s1,s2,s3是三个全局结构体的变量(不建议,原因: 尽量少用使用全局变量)
typedef
typedef struct Stu{//成员变量char name[60];short age;char tele[12];char sex[5];}Stu;
- typedef: 把
struct结构体类型重新起名字(这里是重起了Stu)
int main(){//struct Stu s; //局部的结构体变量Stu s1; //使用了typedef可以这样写return 0;}
结构体的类型
结构的成员可以是标量(普通变量)、数组、指针,甚至可以是其他结构体。
数组里面放数据用大括号,结构体里面发数据也是用大括号
typedef struct Stu{//成员变量char name[60];short age;char tele[12];char sex[5];}Stu;int main(){Stu s1 = {"张三",20,"15637","男"};//局部变量struct s2 = {"李四",20,"135728","保密"};}
/*StuTwo.c -- 结构体成员类型*/#include "stdio.h"struct S{int a;char c;char arr[20];double d;};struct T{char ch[10];struct S s;char* pc;};int main(){char arr[] = "hello bit";struct T t = {"hehe",{100,'w',"hello world",3.14},arr};//初始化赋值printf("%s\n",t.ch); //打印结构体中的数据printf("%s\n",t.s.arr); //打印结构体中的结构体中的数据printf("%lf\n",t.s.d);printf("%s\n",t.pc);return 0;}
注: 俩个arr互不影响,不同范围的变量互不干扰互不影响
/*StuThree.c -- 常规写法*/#include "stdio.h"typedef struct Stu{//成员变量char name[20];short age;char tele[12];char sex[5];}Stu;void Print1(Stu tmp){printf("name:%s\n",tmp.name);printf("age:%d\n",tmp.age);printf("tele:%s\n",tmp.tele);printf("sex:%s\n",tmp.sex);}int main(){Stu s = {"李四",25,"15161314","男"};Print1(s);return 0;}
/*StuThree.c -- 箭头*/#include "stdio.h"typedef struct Stu{//成员变量char name[20];short age;char tele[12];char sex[5];}Stu;void Print2(Stu* ps){printf("name: %s\n",ps->name);printf("age: %d\n",ps->age);printf("tele: %s\n",ps->tele);printf("sex: %s\n",ps->sex);}int main(){Stu s = {"李四",25,"15161314","男"};//Print1(s); //常规写法Print2(&s); //传入的参数是指针return 0;}
- 方法1(Print1(Stu tmp)): 传入实参,形参会开辟一个与实参大小相同的内存空间,浪费了资源
- 方法2(Print2(Stu* ps)): 传入的实参的内存,地址,形参只需要开辟指针变量的内存地址,指向实参的内存地址,尽而节约空间
数据结构
线性数据结构
- 顺序表
- 1,2,3,4,5,6(数组)按顺序存储
- 链表
- 1->2->3->4->5->6(1能找到2,2能找到3,…) 这就是链表
- 栈
- 放入元素叫压栈
- 取出元素叫出栈(弹栈)
- 先进后出,后进先出原则
- 队列
+
树形数据数据结构
- 二叉树
- 图
Debug和Release的介绍
- Debug通常称为调试版本,它包含调试信息,并不做任何优化。便于程序员调试程序。
- Release称为发布版本,它王五进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。
