c语言—指针高级和宏定义

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 #include #include #include
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

你可能感兴趣的:(c语言—指针高级和宏定义)