C_Language_10

C_Language_10

结构体:由一系列具有相同类型或不同类型的数据构成的数据集合,是一种自定义数据结构
示例:
定义:typedef struct teacher{
                  char name[20];
                 int age;
          }Teacher;
         Teacher t1 = {"zhangsan",12};//赋值
         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).name表示:p指向结构体变量中的成员变量name的存储单元
注意:()不能省略,因为 . 的优先级高于*
        Teacher t2 = {"xiaoweiba",22};
        Teacher *q = &t2;
        printf("%s %d\n",(*q).name,(*q).age);
        strcpy((*q).name, "wanghan");
        (*q).age = 32;
        printf("%s %d\n",(*q).name,(*q).age);
第二种方式:通过指向箭头访问(常用)
        printf("%s %d\n",q->name,q->age);
        Teacher t3 = {"lusi",24};
        Teacher *r = &t3;
        r->age = 34;
        strcpy(r->name, "liuchen");
        printf("%s %d",r->name,r->age);

//求两点距离
float distanceOfTwoPoint(Cpiont *p1,Cpiont *p2){
    float dx = p1->x - p2->x;//x方向差值
    float dy = p1->y - p2->y;//y方向差值
    
    float distance = sqrtf(dx * dx + dy * dy);
    
    return distance;
    
}  
定义cpoint结构体类型的变量
       typedef struct cpiont{
           float x;
           float y;
       }Cpiont;
        Cpiont point1 = {100,100};
        Cpiont point2 = {103,104};
        //    定义cpoint结构体类型指针 分别指向两个变量
        Cpiont *p11 = &point1;
        Cpiont *p22 = &point2;
        //  计算两点间的距离
        printf("\ndistance = %.1f\n",distanceOfTwoPoint(p11, p22));//调用求距离函数

指针与结构体:
运算符优先级 从高到低
 []    ->    .    *    &

访问数组元素的方式:
       结构体对象.成员变量
       结构体对象->成员变量

定义一个Student结构体数组,3个元素
        Student stu[3] = {{1,"zhangsan",'m',17},
                          {2,"lisi",'f',18},
                          {3,"wangwu",'m',19}};
    //    输出第一个学生的年龄
        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("%d %s %c %d\n",stu1.num,stu1.name,stu1.sex,stu1.age);
    
        }
        printf("----------------------\n");
        for (int i = 0; i < 3; i++) {
            printf("%d %s %c %d\n",(p+i)->num,(p+i)->name,(p+i)->sex,(p+i)->age);
        }
        printf("----------------------\n");
        for (int i = 0; i < 3; i++) {
            printf("%d %s %c %d\n",(*(p+i)).num,(*(p+i)).name,(*(p+i)).sex,(*(p+i)).age);
        }
    
结构体指针作为函数的参数:在函数中操作结构体数组时,需要传入数组首地址和元素个数
使用指针查找学员数组中性别为男的学员,成绩增加10分(超过100分的记为100分)
        student stu[5] = {{01,"liwei",'m',95.3},
            {02,"zengxiaoxian",'m',95.3},
            {03,"luziqiao",'m',75.3},
            {04,"huyifei",'w',95.3},
            {05,"tanyouyou",'w',97.3}};
        student *p = stu;
        for (int i = 0; i < 5; i++) {
            if ((p+i)->sex == 'm') {
                (p+i)->score += 10;
                if ((p+i)->score > 100) {
                    (p+i)->score = 100;
                }
            }
        }
        for (int i = 0; i < 5; i++) {
            printf("学号:%d 姓名:%s 性别:%c 分数:%0.2f\n",(*(p+i)).num,(*(p+i)).name,(*(p+i)).sex,(*(p+i)).score);
        }
        for (p = stu; p < stu+5; p++) {
            printf("学号:%d 姓名:%-12s 性别:%c 分数:%0.2f\n",p->num,p->name,p->sex,p->score);
        }
    
预编译:
        预编译指令
        预编译:即在编译之前做的操作
        定义宏的时候不允许添加
        #define 宏名 内容
        宏名代表内容;程序预编译时,将代码中的宏替换为相应的内容
    #define PI 3.14159267
        float a = PI;
        printf("%f\n",a);
    #define kPrin printf("hello world\n")
        kPrin;
    使用已经定义的宏
    #define W 3
    #define H 5
    #define S W*H
    printf("%d\n",S);
    
        带参宏定义  
计算两个数相乘的结果
    #define MUL(A,B) (A)*(B)   //(A)*(B)括号不能省略
        printf("%d\n",MUL(3,5));
    
宏只做替换
    #define MUL(A,B) A*B   //#define MUL(A,B) (A)*(B) //不一样
    #define A 1+2
    #define B 3+4
    printf("%d\n",MUL(A,B));  //宏只做替换: 1+2*3+4 = 11
    
小结:
        1.宏定义:指定一个字符(符号)代表一个字符串
        2.PI:宏名
        3.宏定义分类:有参数、无参数
        4.宏定义没有(分号);
        5.宏定义只在编译期将所有的指定字符,替换为对应的字符串
        6.有参数的宏,先替换,再计算。名字和参数()之间不能有间隔  MUL(A,B)
        7.宏不分配内存空间
        8.宏消耗的是编译期的时间,函数消耗的是运行期的时间
        9.不能做类型检测
        10.一般定义主函数main函数前,做全局变量用
    
条件编译 第一种
    #define INT 10
    #ifdef INT
        int a = 50;//宏定义过 INT 则 a= 50
    #else
        int a = 100;//宏没定义过 INT 则 a= 50
    #endif
        printf("a = %d\n",a);
    
条件编译 第二种
    #define INT 10
    #ifndef INT
        int a = 50;//宏没定义过 INT 则 a= 50
    #else
        int a = 100;//宏定义过 INT 则 a= 50
    #endif
        printf("a = %d\n",a);
    
条件编译 第三种
    #if 1  //表达式结果非0 编译期编译代码段1,否则编译代码段2
        int a = 5;//代码段1
    #else
        int a = 10;//代码段2
    #endif
        printf("a = %d\n",a);
        
        for (int i = 0; i < a; i++) {
            for (int j = 0; j <= a; j++) {
                printf("*****\n");
            }
        }

posted @ 2015-12-03 19:16  DH_Fantasy  阅读(75)  评论(0)    收藏  举报