zoukankan      html  css  js  c++  java
  • C 入门 第九节 结构体指针

    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 ",t1.name,t1.age);
        
    //  结构体指针 : 指针指向结构体变量的存储单元
    //  对结构体变量取地址
    //  指针指向结构体的起始地址,即首个成员变量的地址,
        Teacher *p = &t1;
        printf("%p %p ",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 ",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 ",distanceOfTwoPoint(p11, p22));
     */
        
    #pragma marki ---------------指针与结构体数组的关系-----------
    /*  运算符优先级 从高到低
        [] -> . * &
        定义一个student结构体数组,3个元素

        Student stu[3] =
        {
            {"zhangsan",'m',17},
            {"lisi",'m',18},
            {"xiaohong",'f',16}
        };
    //结构体对象,成员变量
    // 结构体对象->成员变量
    //访问数组元素的方式
    //输出第一个学生的年龄
        printf("%d ",stu[0].age);
        
    //输出第二个学生的年龄
        printf("%d ",(*(stu + 1)).age);
        
    //输出第三个学生的年龄
        printf("%d ",(stu + 2) -> age);
        
    //定义指针指向结构体数组,使用指针访问结构体数组元素
    // 遍历数组
        Student *p = stu;
        for (int i = 0; i < 3; i ++)
        {
            //使用指针访问成员变量
            Student stu1 = *(p+i);
            printf("%s %c %d ",stu1.name,stu1.sex,stu1.age);
        }
        
        for (int i = 0; i < 3; i ++)
        {
            //使用指针法访问成员变量
            printf("%s %c %d ",(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 ",(p + i) -> name,(p + i) -> sex,(p + i) -> age,(p + i) -> score);
        
       
        }
     */
        
    #pragma mark ----------预编译-------------
    /*
        预编译指令
        预编译:即在编译之前做的操作
        定义宏的时候不允许添加
        #define 宏名 内容
        宏名 代表 内容; 程序预编译时,将代码中的宏替换为相应的内容

        
    #define pi 3.1415926   //没有分号
        float a = pi;
        printf("%f ",a);
        
    #define kPrint printf("hello worle! ");
        kPrint;
    // 使用以及定义的宏
    #define w 3
    #define h 5
    #define s w * h
        printf("%d ",s);
     */
        
    //  带参宏定义 计算俩个数相乘的结果
    //#define MUL(a,b) a * b
    //    printf("%d ",MUL(3,5));
     
    /*
    #define MUL(a,b) a * b   //没括号 (a) * (b)
    #define a 1+2
    #define b 3+4
        printf("%d ",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 ",a);
    */
    /*
    #ifndef INT
        int a = 50;
    #else
        int a = 100;
    #endif
        printf("a = %d ",a);
    */
    /*
    #if 1
        int b = 20;
    #else
        int b = 30;
    #endif
        printf("%d ",b);
    */
       

  • 相关阅读:
    Java中的String问题
    【转载】Java与C++语言在作用域上的差异浅析
    【转载】Java是传值还是传引用
    Boost学习资源
    程序4-4 chmod函数实例
    程序4-3 umask函数实例
    程序4-2 access函数实例
    程序4-1 对每个命令行参数打印文件类型
    程序3-5 对一个文件描述符打开一个或多个文件状态标志
    程序3-4 对指定的描述符打印文件标志
  • 原文地址:https://www.cnblogs.com/wangshuai-1129/p/5079088.html
Copyright © 2011-2022 走看看