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