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等没有进行测试)

  • 相关阅读:
    简单的Vue示例
    Vue开发环境搭建基本操作
    2020CentOS官网下载镜像方法
    while((ch=getchar()) !=EOF && ch != ' ');语句作用
    Mac 下使用svn
    用树形结构递归渲染权限列表
    .net core中使用jwt进行认证
    C#中异步多线程的实现方式
    redis-避免生产环境使用keys命令
    让visual studio总是以管理员身份启动
  • 原文地址:https://www.cnblogs.com/Older-Driver-of-Newer/p/6497612.html
Copyright © 2011-2022 走看看