1.结构体指针
1)指向结构体的指针
2)(*p).sex = ‘m’
p->sex = ‘m’
(*p)对指针的取值后是结构体变量,。sex是访问成员变量
使用指针可以直接访问结构体成员变量p->sex
3)练习
/*定义⼀一个点坐标的结构体CPoint,包含两个float 成员x,y。 定义两个CPoint结构体变量m,n 使⽤用两个结构体指针分别指向m,n 然后通过指针计算两点距离(提⽰示:1、勾股定理,2、开⽅方函数sqrt)*/
/*请通过p将name成员中的第⼀一个字⺟母改成⼤大写,所有’ ‘(空格)改成下 划线’_’*/#include <stdio.h> #include<stdlib.h> #include <math.h> #include <string.h>
typedef struct student { int number; char name [20]; float score; char gender; }Student; typedef struct cpoint { float x; float y; }CPoint; double juLi(CPoint *p,CPoint *p1) { // CPoint *p = &cp; // CPoint *p1 = &cp1; return sqrt(((p->x)-(p1->x))*((p->x)-(p1->x))+((p->y)-(p1->y))*((p->y)-(p1->y))); } double juLi1(CPoint *p,CPoint *p1) { return sqrt(((p->x)-(p1->x))*((p->x)-(p1->x))+((p->y)-(p1->y))*((p->y)-(p1->y))); } void gaiNam(Student *p) { for (int i = 0 ; i < strlen(p->name); i ++) { if (i==0) { p->name[i]-=32; } if (p->name[i]==' '&&p->name[i+1]!=' ') { p->name[i]='_'; } } printf("%s\n",p->name); } int main(int argc, const char * argv[]) { /*请通过p将name成员中的第⼀一个字⺟母改成⼤大写,所有’ ‘(空格)改成下 划线’_’*/ Student stu= {1,"lan ou ke ji",78,'F'}; //Student *p = &stu; gaiNam(&stu); /* CPoint cp = {7,6}; CPoint cp1 = {2,8}; double sq = juLi(&cp, &cp1); double sq1 = juLi1(&cp, &cp1); printf("%f\t%f\n",sq,sq1); */ return 0; }
1)#define
2)#include
宏定义只替换不做运算,所以一般要在宏定义外面加(),以免影响运算的优先级
宏定义行尾不能加分号;
宏定义命名要么大写,要么用驼峰命名法
宏定义命名必须在一行内完成,也不能换行;
宏定义允许嵌套使用
宏定义的结束标识符是#undef 宏名
3.1)#ifdef 标示符
代码段一
#else
代码段二
#endif
如果 标识符 未被#define过 编译器编译代码段1,否则编译代码段2
3.2)#ifndef 标示符
代码段一
#else
代码段二
#endif
如果 标识符 未被#define过 编译器编译代码段1,否则编译代码段2
3.3)#if 常量表达式
代码段一
#else
代码段二
#endif
如果常量表达式结果⾮非0 编译器编译代码段1,否则编译代码段2
1)指向结构体的指针
2)(*p).sex = ‘m’
p->sex = ‘m’
(*p)对指针的取值后是结构体变量,。sex是访问成员变量
使用指针可以直接访问结构体成员变量p->sex
3)练习
/*定义⼀一个点坐标的结构体CPoint,包含两个float 成员x,y。 定义两个CPoint结构体变量m,n 使⽤用两个结构体指针分别指向m,n 然后通过指针计算两点距离(提⽰示:1、勾股定理,2、开⽅方函数sqrt)*/
/*请通过p将name成员中的第⼀一个字⺟母改成⼤大写,所有’ ‘(空格)改成下 划线’_’*/#include <stdio.h> #include<stdlib.h> #include <math.h> #include <string.h>
typedef struct student { int number; char name [20]; float score; char gender; }Student; typedef struct cpoint { float x; float y; }CPoint; double juLi(CPoint *p,CPoint *p1) { // CPoint *p = &cp; // CPoint *p1 = &cp1; return sqrt(((p->x)-(p1->x))*((p->x)-(p1->x))+((p->y)-(p1->y))*((p->y)-(p1->y))); } double juLi1(CPoint *p,CPoint *p1) { return sqrt(((p->x)-(p1->x))*((p->x)-(p1->x))+((p->y)-(p1->y))*((p->y)-(p1->y))); } void gaiNam(Student *p) { for (int i = 0 ; i < strlen(p->name); i ++) { if (i==0) { p->name[i]-=32; } if (p->name[i]==' '&&p->name[i+1]!=' ') { p->name[i]='_'; } } printf("%s\n",p->name); } int main(int argc, const char * argv[]) { /*请通过p将name成员中的第⼀一个字⺟母改成⼤大写,所有’ ‘(空格)改成下 划线’_’*/ Student stu= {1,"lan ou ke ji",78,'F'}; //Student *p = &stu; gaiNam(&stu); /* CPoint cp = {7,6}; CPoint cp1 = {2,8}; double sq = juLi(&cp, &cp1); double sq1 = juLi1(&cp, &cp1); printf("%f\t%f\n",sq,sq1); */ return 0; }
}2.结构体数组的数组名是一个结构体指针常量
3.预编译指令1)#define
2)#include
宏定义只替换不做运算,所以一般要在宏定义外面加(),以免影响运算的优先级
宏定义行尾不能加分号;
宏定义命名要么大写,要么用驼峰命名法
宏定义命名必须在一行内完成,也不能换行;
宏定义允许嵌套使用
宏定义的结束标识符是#undef 宏名
3.1)#ifdef 标示符
代码段一
#else
代码段二
#endif
如果 标识符 未被#define过 编译器编译代码段1,否则编译代码段2
3.2)#ifndef 标示符
代码段一
#else
代码段二
#endif
如果 标识符 未被#define过 编译器编译代码段1,否则编译代码段2
3.3)#if 常量表达式
代码段一
#else
代码段二
#endif
如果常量表达式结果⾮非0 编译器编译代码段1,否则编译代码段2