//---------------------
结构体
什么是结构体? 答:若干个相同或者不同类型的数据组成的新的类型 如何定义结构体 struct 结构体名{ 成员列表; 格式: 类型 变量名; }; //-----------------结构体变量 结构体变量特点: 一个复合类型,具备结构体的特性 struct stu{ int age; }stu1,stu2; //匿名结构体 struct{ int model; }s1; // //先定义结构体,后定义变量 struct stu stu3; //------------------结构体变量中成员的访问方法 结构变量名.成员名 点语法 boy1.num boy1的学号 boy2.sex boy2的性别 boy1.birthday.month boy1的生日的月份 //-------------------如何初始化结构体变量 初始化的时候,注意成员的顺序 //先定义结构体变量,后初始化 struct stu{ int age; char name[20]; //字符串数组 // char *name2; //字符串指针 }stu1; stu1.age =10; stu1.name = "xxx" ; //错误的 strcpy(stu1.name,"xxx"); //正确的 通过strcpy方法 stu1.name2 = "xxx" //正确 struct stu1 = {18,"xxx"}; //定义同时进行初始化 严格遵守定义顺序 1)全部输初始化 struct stu{ int age; char name[20]; }stu1={23,"sss"}; 2)部分初始化 struct stu boy1={.name="weige"}; //---------------------结构体存储空间 结构体在内存中占用的存储空间是 所有元素占用空间之和(考虑对齐) 1.逐个元素对齐(下个元素与之前所有元素之和对齐) 2.整体对齐(最后的和能单独整除所有元素)--> 最后能整除最长类型 //-------------------结构体作用域 全局 Person { 局部 Person
Person } 局部的被释放了 Person 1、结构体的数组 定义:由相同类型的结构体变量组成的有序的集合。 定义格式: 1) 定义结构体的同时定义结构体数组 struct Car{ int lunzi; int speed; }cars[5]; 2) 使用匿名结构体定义数组 struct { int lunzi; int speed; }cars[5]; 3)先定义结构体,再定义结构体数组 struct Car cars[5]; 初始化: 1) 定义结构体数组的同时进行初始化 struct Car{ int lunzi; int speed; char name[20]; }cars[2]={{2,50},{80,300}}; 2) 匿名 struct { int lunzi; int speed; int speed; }cars[2]={{2,50},{80,300}}; 3) struct Car cars[2]={{2,50},{80,300}}; 4)先定义数组,后初始化 cars[0].lunzi = 4; cars[0].speed = 200; //cars[0].name="xxxx"; 错误的 strcpy(cars[0].name,"xxxx"); const char a; 通过数组角标整体去初始化 cars[1]=(struct Car){6,100}; 2、结构体指针 定义:指向结构体的指针 格式:结构体类型 * 结构体指针变量名; struct Student stu1; struct Studetn *pstu; pstu = &stu1; 作用:可以间接访问结构体变量中保存的成员变量值 (*pstu).name (*pstu).sno 新的访问方法 pstu->name // 只有结构体指针变量才可以 等价于 (*pstu).name 3、结构体与函数之间的关系 1)结构体变量作为函数的参数 (值传递) 2)结构体指针作为函数的参数 (地址传递) 4、枚举类型 使用场合:在开发中,如果一个变量只有有限的几个取值,可以使用枚举 1)枚举类型 enum 枚举类型名{枚举值1,值2,值3,...}; 2)枚举类型的变量 enum SEX{man,women,yao}isex; enum {man,women,yao}s1; enum SEX s2; 3)枚举类型变量的使用 1)枚举元素的值 系统默认给枚举变量第一元素赋值为0,后面的元素依次是上一个元素+1 2)给枚举类型变量赋值 isex = man; printf("%d\n",isex); 5、typedef定义类型 定义:给已经存在的数据类型取一个别名 格式:typedef 原类型 新类型名; //新类型名尽量要大写 5.1、基本数据类型 typedef int MALATANG; 别名: MALATANG 5.2、用在数组,给数组起别名 typedef int ARRAY[5]; 别名: ARRAY 5.3、给结构体其别名 typedef struct Person P; 别名: P typedef struct { int screenSize; int ram;} IPHONE; 别名: IPHONE 5.4、给枚举类型起别名 typedef enum Sex{kSexMan,kSexWomen,kSexYao} ISEX; 别名: ISEX 5.5. 给函数指针起别名 typedef int (*FUN)(int,int); 别名:FUN 6、预处理指令的概念 定义:以“#” 开头的一些特殊的指令 作用: 在编译之前做些处理(宏展开,条件编译,文件包含) 常见的预处理指令: 宏 宏:特殊的标示符 宏替换 :在编译之前,在源文件中,所有出现宏名的地方 都用宏代表的字符串 去替换 注意:宏不是语句,不需要分号结束 1)无参宏 #define 宏名 宏代表的字符串 #define M 10 #define AREA 3.14*M*M #define PI 3.14 2)有参宏 #define Mi(y) y*y+3*y // y 是形参,不分配空间,不需要写类型 #define MAX(a,b) a>b?a:b #define SUM(a,b) a+b 7、条件编译 当条件满足的时候去编译一段代码 好处:可移植、生成更小的目标文件 格式: #if #elif #else #endif |