zoukankan      html  css  js  c++  java
  • C/C++语言结构体中定义另一个结构体指针的经验

    本文进行讨论的是,在Linux中,C/C++语言的结构体的使用情况。一般情况下,结构体的使用还是相对比较简单的,它携带的一类物体的某一些属性,

    比如

    struct person
    {
       int age;
       int height;
      //...  
    };
    

    这个结构一携带的就是一个人的两个基本信息,年龄(age)和身高(height),同样你也可以继续添加人的相关信息进去,比如学号,班级等。

    但是今天讨论的是在结构体中定义一个结构体指针的问题,当然这也可以延伸到结构体定义一个普通类型的指针方面,读者可以自行进行验证或者思考,本文

    不作讨论。

    typedef struct tagStudent_T
    {
        int i_StuID;
        int i_StuClass;
    }Student_T;
    
    typedef struct tagSchool_T
    {
        Student_T *student;
        int i_SchoolRank;
    }School_T;
    

    上述的两个结构体表示的含义是:

    第一个: 学生的个人信息

    第二个:学校的情况(包含了学生的信息和学校的排名)

    接下来,如果要对Statuend_T的结构体的变量进行设置,那么有两种方法,第一个直接使用Student_T定义的变量进行赋值,第二个就是使用School_T进行间接赋值,

    今天就是讨论第二种的方法。

    首先,在一个程序运行过程中,实际上是内存指针在操作,因此我们定义School_T的指针*school,具体的操作如下程序

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    typedef struct tagStudent_T
    {
        int i_StuID;
        int i_StuClass;
    }Student_T;
    
    typedef struct tagSchool_T
    {
        Student_T *student;
        int i_SchoolRank;
    }School_T;
    
    int main(int argc,char const *argv[])
    {
        School_T *school = (School_T *)malloc(sizeof(School_T));
        if(NULL != school)
        {
             school->i_SchoolRank = 1;  //rank first 
             
            /*由于School_T中定义的student是一个结构体指针,必须要对其进行分配内存*/
            school->student = (Student_T *)malloc(sizeof(Student_T));
            if(NULL != school->student)
            {
                    school->student->i_StuID = 12345;
                    school->student->i_StuClass = 5;
            }      
            else
            {
                free(school);
            }
        }        
        
        /*这两个的free顺序最好不要调转,因为如果先free掉school的话,相当于将student得本体free了,相当于一个野指针 */    
        free(school->student);
        free(school);
    }    

    如果你不想使用这种方式,大可直接使用变量,不是指针类的变量,如School_T school。同样School_T结构体重使用的也是一个普通的变量,即Student_T student,这样,

    你就不需要进行内存指针的操作。但是本人建议还是使用指针来进行,效率相对而言会更快一点。可以参考一些<C和指针>这本书

    (注:上述的编译只在Ubuntu下的Linux系统操作,其他的win,vs等没有进行测试)

  • 相关阅读:
    bzoj1015星球大战(并查集+离线)
    bzoj1085骑士精神(搜索)
    bzoj1051受欢迎的牛(Tarjan)
    左偏树学习
    hdu1512 Monkey King(并查集,左偏堆)
    左偏树(模板)
    PAT (Basic Level) Practice (中文) 1079 延迟的回文数 (20分) (大数加法)
    PAT (Basic Level) Practice (中文) 1078 字符串压缩与解压 (20分) (字符转数字——栈存放)
    PAT (Basic Level) Practice (中文) 1077 互评成绩计算 (20分) (四舍五入保留整数)
    PAT (Basic Level) Practice (中文) 1076 Wifi密码 (15分)
  • 原文地址:https://www.cnblogs.com/Older-Driver-of-Newer/p/6497612.html
Copyright © 2011-2022 走看看