zoukankan      html  css  js  c++  java
  • C 结构体小结

    C 结构体小结

    关于结构体的声明:

    # include <stdio.h>
    
    //第一种方式
    struct Student
    {
        int age;
        float score;
        char sex;
    };
    
    //第二种方式
    struct Student2
    {
        int age;
        float score;
        char sex;
    } st2;
    
    //第三种方式
    struct 
    {
        int age;
        float score;
        char sex;
    } st3;
    
    int main(void)
    {
        struct Student st = {80, 66.6, 'F'};    
    
        return 0;
    }

    结构体变量的赋值和初始化:

    1.

    # include <stdio.h>
    
    //第一种方式
    struct Student
    {
        int age;
        float score;
        char sex;
    };
    
    int main(void)
    {
        struct Student st = {80, 66.6, 'F'}; //初始化  定义的同时赋初值
        struct Student st2;
        st2.age = 10;
        st2.score = 88;
        st2.sex = 'F';
    
        printf("%d %f %c
    ", st.age, st.score, st.sex);
        printf("%d %f %c
    ", st2.age, st2.score, st2.sex);
        
    
        return 0;
    }

    2.

    # include <stdio.h>
    
    //第一种方式
    struct Student
    {
        int age;
        float score;
        char sex;
    };
    
    int main(void)
    {
        struct Student st = {80, 66.6F, 'F'}; //初始化  定义的同时赋初值
        struct Student * pst = &st;  //&st不能改成st
    
        pst->age = 88;//第二种方式
        st.score = 66.6f; //第一种方式  66.6在C语言中默认是double类型,如果希望一个实数是float类型,则必须在末尾加f或F, 因此66.6是double, 66.6f或66.6F是float
        printf("%d %f
    ", st.age, pst->score);    
    
        return 0;
    }

    引用 : http://www.cnblogs.com/ligongzi/archive/2012/08/24/2654448.html

    struct Student
    {
        char name[20];
        char sex;
        int age;
        char addr[40];
    };
    /*然后定义一个Student 类型的 student变量*/
    struct Student student;

    也许是我受了Java影响,我一度写成这样:

    struct man
    {
        int age = 30;
        int score = 80;
    };
    
    int main()
    {
        man man1  = {20,70};
    
    }

      结果是铁定编译通过不了的。因为这是我自创的声明带默认值的结构体,编译器没见过。

    结构体成员变量在声明中是不能赋值的。

      正确的写法是:

    struct Man
    {
        int age; //这样就好了
        int score;
    };
    
    int main()
    {
       struct Man man1 = {30,80};
    }

     定义结构体的时候每次都要写struct 显然是烦琐了,

    精炼的C语言用来typedef来方便定义使用:

    typedef struct Man
    {
        int age;
        int score;
    }man;
    
    int main()
    {
        man man1 = {20,80};
        man man2 = {30,70};
        man man3 = {40,99};
        printf("%d
    ",man1.age);
        printf("%d
    ",man3.score);
    }

    这样一来大家想召唤多少个“男人”都没有问题。另外有一个极端一点的问题,声明结构体名和定义结构体变量名能不能一样?我们可以试试看:

    typedef struct man
    {
        int age;
        int score;
    }man;  //还叫man,有意见么?
    
    int main()
    {
        man man = {40,50};//还叫man,有问题么?
        printf("%d	%d
    ",man.age,man.score);
    }

    编译运行都是没有问题的。不信自己去试试看。

       然后我们来讨论重点吧:

    struct Student
    {
        char name[20];
        char sex;
        int age;
        char addr[40];
    };
    /*然后定义一个Student 类型的 student变量*/
    struct Student student;

    给定义的结构中name和age赋值, 可以用下面语句:

        

         strcpy(student->name, "jack");
    
         student->age=21;
    
         student->name就是(*student).name的缩写形式。

        需要指出的是结构指针是指向结构的一个指针, 是结构中第一个成员的首地址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间, 这可用下面函数完成, 仍以上例来说明如下:

       

      student=(struct string*)malloc(size of (struct string));

        size of (struct string)自动求取string结构的字节长度, malloc() 函数定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。  

        注意:

        结构变量名不是指向该结构的地址, 这与数组名的含义不同,  因此若需要求结构中第一个成员的首地址应该是&[结构变量名]。

     demo.

    /*
        2009年11月24日9:17:43
        示例:
            发送地址还是发送内容
        目的:
            指针的优点之一:
                快速的传递数据,
                耗用内存小
                执行速度快
    */
    
    
    # include <stdio.h>
    # include <string.h>
    
    struct Student
    {
        int age;
        char sex;
        char name[100];
    }; //分号不能省
    
    void InputStudent(struct Student *);
    void OutputStudent(struct Student *);
    int main(void)
    {
        struct Student st ;  //15行
        //printf("%d
    ", sizeof(st));
    
        InputStudent(&st); //对结构体变量输入  必须发送st的地址
        OutputStudent(&st); //对结构体变量输出  可以发送st的地址也可以直接发送st的内容 但为了减少内存的耗费,也为了提高执行速度,推荐发送地址
    
        return 0;
    }
    
    void OutputStudent(struct Student *pst)
    {
        printf("%d %c %s
    ", pst->age, pst->sex, pst->name);
    }
    
    void InputStudent(struct Student * pstu) //pstu只占4个字节
    {
        (*pstu).age = 10;
        strcpy(pstu->name, "张三");
        pstu->sex = 'F';    
    }
    
    /*
    //本函数无法修改主函数15行st的值 所以本函数是错误的
    void InputStudent(struct Student stu)
    {
        stu.age = 10;
        strcpy(stu.name, "张三");  //不能写成 stu.name = "张三";
        stu.sex = 'F';
    }
    */
  • 相关阅读:
    BadUSB 利用
    java 将函数作为参数传递
    odoo12 修行提升篇之 常用的高阶函数 (二)
    odoo12 修行提升篇之 异步定时任务 (一)
    odoo12 修行基础篇之 利用kanban做分析 点击跳转分析模型列表 (九)
    odoo12 修行基础篇之 kanban (八)
    odoo12 修行基础篇之 记录批处理 (七)
    odoo12 修行基础篇之 列表的筛选和分组 (六)
    odoo12 修行基础篇之 添加记录编码 (五)
    odoo12 修行基础篇之 添加工作流和操作记录 (四)
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3816039.html
Copyright © 2011-2022 走看看