typedef struct teacher
{ char name[30]; int age;}Teacher;typedef struct student{ char name[20]; char sex; int age; }Student;typedef struct student1{ char name[20]; char sex; int age; float score; }Student1;int main(int argc, const char * argv[]) { /* Teacher t1 = {"zhangsan",18}; t1.age = 20; strcpy(t1.name, "wangwu"); printf("%s %d\n",t1.name,t1.age); // 结构体指针 : 指针指向结构体变量的存储单元// 对结构体变量取地址// 指针指向结构体的起始地址,即首个成员变量的地址, Teacher *p = &t1; printf("%p %p\n",p,t1.name); 通过结构体指针访问成员变量 第一种方式: 使用指针取值运算符 (*p).age (*p.name) : (*p)表示:p指向结构体变量的存储单元 (*p).name表示:p指向结构体变量中的成员变量name的存储单元 注意: ()不能省略,因为 . 的优先级搞英语 * Teacher t2 = {"lisi",22}; Teacher *q = &t2; (*q).age = 32; strcpy((*q).name, "zhaoliu"); printf("%s %d ",(*q).name,(*q).age);// 第二种方式: 通过指向箭头访问(常用)// q->age; Teacher t3 = {"xiaohong",24}; Teacher *r = &t3; r->age = 34; strcpy(r->name, "xiaolv"); printf("%s %d\n",r->name,r->age);*/ /* 练习 : 定义一个点坐标的结构体CPiont.包含俩个float成员 x,y 定义俩个CPiont结构体变量m,n 使用俩个结构体指针 分别指向m,n 然后通过指针计算俩点距离(提示:1.勾股定理 2.开放函数sqrt); //定义cpoint结构体类型的变量 CPoint point1 = {3,4}; CPoint point2 = {7,8}; // 定义cpoint结构体类型指针 分别指向两个变量 CPoint *p11 = &point1; CPoint *p22 = &point2; // 计算两点间的距离 printf("distance = %.2f\n",distanceOfTwoPoint(p11, p22)); */ #pragma marki ---------------指针与结构体数组的关系-----------/* 运算符优先级 从高到低 [] -> . * & 定义一个student结构体数组,3个元素 Student stu[3] = { {"zhangsan",'m',17}, {"lisi",'m',18}, {"xiaohong",'f',16} };//结构体对象,成员变量// 结构体对象->成员变量//访问数组元素的方式//输出第一个学生的年龄 printf("%d\n",stu[0].age); //输出第二个学生的年龄 printf("%d\n",(*(stu + 1)).age); //输出第三个学生的年龄 printf("%d\n",(stu + 2) -> age); //定义指针指向结构体数组,使用指针访问结构体数组元素// 遍历数组 Student *p = stu; for (int i = 0; i < 3; i ++) { //使用指针访问成员变量 Student stu1 = *(p+i); printf("%s %c %d\n",stu1.name,stu1.sex,stu1.age); } for (int i = 0; i < 3; i ++) { //使用指针法访问成员变量 printf("%s %c %d\n",(p + i) -> name,(p + i) -> sex,(p + i) -> age); } //结构体指针作为函数的参量 //在函数中操作结构体数组是,需要传入数组的首地址和元素个数 // 练习: 使用指针 查找学生数组中 性别为男生的学员,成绩加10分,(超过100分的记作100分) Student1 stu[3] = { {"zhangsan",'m',17,86}, {"lisi",'m',18,93}, {"xiaohong",'f',16,95} }; Student1 *p = stu; for (int i = 0; i < 3; i ++) { if ((p + i) -> sex == 'm') { if ((p + i) -> score < 90) { (p + i) -> score = (p + i) -> score + 10; } else (p + i) -> score = 100; } printf("%s %c %d %.2f\n",(p + i) -> name,(p + i) -> sex,(p + i) -> age,(p + i) -> score); } */ #pragma mark ----------预编译-------------/* 预编译指令 预编译:即在编译之前做的操作 定义宏的时候不允许添加 #define 宏名 内容 宏名 代表 内容; 程序预编译时,将代码中的宏替换为相应的内容 #define pi 3.1415926 //没有分号 float a = pi; printf("%f\n",a); #define kPrint printf("hello worle!\n"); kPrint;// 使用以及定义的宏#define w 3#define h 5#define s w * h printf("%d\n",s); */ // 带参宏定义 计算俩个数相乘的结果//#define MUL(a,b) a * b// printf("%d \n",MUL(3,5)); /*#define MUL(a,b) a * b //没括号 (a) * (b)#define a 1+2#define b 3+4 printf("%d\n",MUL(a,b));*//* 1 . 宏定义: 指定一个字符(符号)代表一个字符串 2 . PI: 宏名 3 . 宏定义分类: 有参数,无参数 4 . 宏定义没有 ; 5 . 宏定义只在编译期将所有的指定字符,替换为对应的字符串 6 . 有参数的宏,先替换在计算.名字和参数()之间不能有间隔 7 . 宏不分配内存空间 8 . 宏消耗的是编译期的时间,函数消耗的是运行期的时间 9 . 不能做类型检测*/ // 条件编译 第一种 /* #ifdef 标识符 代码段1 #else 代码段2 #endif! 如果 标识符 被#define过 ,编译器编译代码段1,否则编译代码段2 *//*#define INT 10#ifdef INT int a = 50;#else int a = 100;#endif printf("a = %d\n",a);*//*#ifndef INT int a = 50;#else int a = 100;#endif printf("a = %d\n",a);*//*#if 1 int b = 20;#else int b = 30;#endif printf("%d\n",b);*/