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';
    }
    */
  • 相关阅读:
    四则运算2
    四则运算1
    学习进度条
    Mat数据结构
    Markdown语法
    C++继承和派生
    C++智能指针
    clion配置ROS
    视觉十四讲:第六讲_g2o图优化
    视觉十四讲:第六讲_ceres非线性优化
  • 原文地址:https://www.cnblogs.com/mjorcen/p/3816039.html
Copyright © 2011-2022 走看看