结构体 订阅
结构体是由一批数据组合而成的一种新的数据类型。组成结构型数据的每个数据称为结构型数据的“成员”。 [1] 展开全文
结构体是由一批数据组合而成的一种新的数据类型。组成结构型数据的每个数据称为结构型数据的“成员”。 [1]
信息
学    科
计算机 [1]
外文名
struct [1]
中文名
结构体
结构体结构体变量
结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。 [2]  结构体类型不是由系统定义好的,而是需要程序设计者自己定义的。C语言提供了关键字struct来标识所定义的结构体类型。 [2]  关键字struct和结构体名组合成一种类型标识符,其地位如同通常的int、char等类型标识符,其用途就像 int 类型标识符标识整型变量一样可以用来定义结构体变量。定义变量以后,该变量就可以像定义的其他变量一样使用了;成员又称为成员变量,它是结构体所包含的若干个基本的结构类型,必须用“{}”括起来,并且要以分号结束,每个成员应表明具体的数据类型。 [2] 
收起全文
精华内容
下载资源
问答
  • C语言结构体(struct)常见使用方法

    万次阅读 多人点赞 2014-04-14 01:51:57
    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。 (因为C++和C有共通之处,但是在...

    注意:盗版是不会得到修正和更新的!

    今天复习一下struct,顺便挖掘一下以前没注意的小细节:

    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。具体一点说,结构体是让一些很散的数据变得很整,不管是网络传输,还是函数传参,还是为了便于你肉眼管理。

    一个函数,你想传入一个参数void func(),就需要改一下函数定义,加一个数据类型和数据名void func(int i);又想加一个参数,又改一遍void func(int i,double b);如此往复。但是用一个结构体(或者类对象)传入,这个函数定义就可以不改动了,只改结构体就好了,比如一个游戏,你的人物属性有成百上千,你只需要修改你的类与结构体成员就好了。

    (因为C++和C有共通之处,但是在结构体上的某些机制又有所不同,所以后边提了一下C++得东西,不喜欢可以略过,但是2021年了,用纯C的人估计要消失了吧,尤其新人)

    结构体声明与定义:

    第一种:只有结构体定义

    struct stuff{
            char job[20];
            int age;
            float height;
    };

    第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义

    //直接带变量名Huqinwei
    struct stuff{
            char job[20];
            int age;
            float height;
    }Huqinwei;

    也许初期看不习惯容易困惑,其实这就相当于两步合并一步:先定义结构体stuff,再定义变量Huqinwei

    struct stuff{
            char job[20];
            int age;
            float height;
    };
    struct stuff Huqinwei;
    

    第三种:如果该结构体你只用一个变量Huqinwei,而不再需要用

    struct stuff yourname;

    去定义第二个变量。

    那么,附加变量初始化的结构体定义还可进一步简化出第三种

    把结构体名称去掉,用匿名结构体直接定义一个结构体对象(习惯用对象这词了,大家都要习惯,没纯C了),这样更简洁,不过也不能定义其他同类型结构体变量了——除非用typeof再逆向找到这个类型。

    struct{
            char job[20];
            int age;
            float height;
    }Huqinwei;

    第三种附加:使用typeof重新利用HU的结构体定义HU3

    并且定义指针ptr1,ptr2

    #include <stdio.h>
    
    struct
    {
            char a;
            short b;
            int c;
    }HU;
    
    struct
    {
            char a;
            short b;
            int c;
    }HU2;
    
    int main(){
    
            printf("%ld\n",sizeof(HU));
    
            typeof(HU) HU3;
            printf("%ld\n",sizeof(HU3));
            printf("%ld\n",sizeof(HU2));
            typeof(HU) *ptr1 = &HU;
            typeof(HU) *ptr2 = &HU3;
            ptr2->b = 444;
            printf("%d\n",ptr2->b);
            ptr1 = ptr2;
            printf("%d\n",ptr1->b);
    
    
    }
    

    同样的写法,再定义一个结构体成员HU2,他们的“类型”不同,因为如果类型相同,肯定会报错了,实际并没有报。

    不过内存操作角度,HU2和HU应该没有任何区别,也可以用指针强行更改,前提是确认安全,比如没有不同文件不同平台对齐不兼容这种问题,所以C很万能,也很危险

    结构体变量及其内部成员变量的定义及访问:

    绕口吧?要分清结构体变量和结构体内部成员变量的概念。

    就像刚才的第二种提到的,结构体变量的声明可以用:

    struct stuff yourname;

    其成员变量的定义可以随声明进行:

       struct stuff Huqinwei = {"manager",30,185};
    

    也可以考虑结构体之间的“赋值”(拷贝构造):

            struct stuff faker = Huqinwei;
    //或    struct stuff faker2;
    //      faker2 = faker;
    打印,可见结构体的每一个成员变量一模一样
    

    如果不使用上边两种方法,那么成员数组的操作会稍微麻烦(用for循环可能好点)

            Huqinwei.job[0] = 'M';
            Huqinwei.job[1] = 'a';
            Huqinwei.age = 27;
            Huqinwei.height = 185;
    

    结构体成员变量的访问除了可以借助符号".",还可以用"->"访问(下边会提)。

    引用(C++)、指针和数组:

    首先是引用和指针:

    int main()
    {
            struct stuff Huqinwei;
    
            struct stuff &ref = Huqinwei;
            ref.age = 100;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("ref.age is %d\n",ref.age);
    
            struct stuff *ptr = &Huqinwei;
            ptr->age = 200;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("ptr->age is %d\n",ptr->age);
    //既然都写了,把指针引用也加上吧
            struct stuff *&refToPtr = ptr;
            refToPtr->age = 300;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("refToPtr->age is %d\n",refToPtr->age);
    
    
    }
    

    更正:之前给引用的初始化语句写错了,而且没注明引用是纯C中没有的东西(在这么个以C为幌子的博客中)。

    引用是C++特有的一个机制,必须靠编译器支撑,至于引用转换到C中本质是什么,我有个帖子写过
     

    结构体也不能免俗,必须有数组:

    struct test{
            int a[3];
            int b;
    };
    //对于数组和变量同时存在的情况,有如下定义方法:
            struct test student[3] =      {{{66,77,55},0},
                                            {{44,65,33},0},
                                            {{46,99,77},0}};
    //特别的,可以简化成:
            struct test student[3] =       {{66,77,55,0},
                                            {44,65,33,0},
                                            {46,99,77,0}};
    

    变长结构体

    可以变长的数组

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    typedef struct changeable{
            int iCnt;
            char pc[0];
    }schangeable;
    
    main(){
            printf("size of struct changeable : %d\n",sizeof(schangeable));
    
            schangeable *pchangeable = (schangeable *)malloc(sizeof(schangeable) + 10*sizeof(char));
            printf("size of pchangeable : %d\n",sizeof(pchangeable));
    
            schangeable *pchangeable2 = (schangeable *)malloc(sizeof(schangeable) + 20*sizeof(char));
            pchangeable2->iCnt = 20;
            printf("pchangeable2->iCnt : %d\n",pchangeable2->iCnt);
            strncpy(pchangeable2->pc,"hello world",11);
            printf("%s\n",pchangeable2->pc);
            printf("size of pchangeable2 : %d\n",sizeof(pchangeable2));
    }

    运行结果

    size of struct changeable : 4
    size of pchangeable : 4
    pchangeable2->iCnt : 20
    hello world
    size of pchangeable2 : 4

    如上,本例中变长结构体本身长度就是一个int的长度(这个int值通常只为了方便表示后边的数组长度),而后边的数组长度不计算在内,但是该数组可以直接使用。

    (说后边是个指针吧?指针也占长度!这个是不占的!原理很简单,这个东西完全是数组后边的尾巴,malloc开辟的是一片连续空间。其实这不应该算一个机制,感觉应该更像一个技巧吧

    20191113:这块可能有点抽象?建议去了解一下手动开辟空间malloc和指针相关知识,所谓“变长结构体”,不是一个你理解的结构体!至少不是按正常结构体用的,他像是一个逻辑性的概念,空间是malloc开辟的,结构体是以指针形式存在的“虚拟”的概念,简单说,这个“结构体”不在栈空间!

    20160405补充:

    非弹性数组不能用"char a[]"这种形式定义弹性(flexible)变量,必须明确大小。

    弹性数组在结构体中,下面的形式是唯一允许的:

    struct s
    {
            int a;
            char b[] ;
    };

    顺序颠倒会让b和a数据重合,会在编译时不通过。

    char b[] = "hell";也不行(C和C++都不行)

    少了整型变量a又会让整个结构体长度为0,compiler不允许编译通过!不同的是,其实C++形式上是允许空结构体的,本质上是通过机制避免了纯空结构体和类对象,自动给空结构体对象分配一个字节(sizeof()返回1)方便区分对象,避免地址重合!所以呢,C如果有空结构体,定义两个(或一打,或干脆一个数组)该结构体的变量(对象),地址是完全一样的!·!!!!!!!!调试看程序运行,这些语句其实都被当屁放了,根本没有运行,没有实际意义,C压根不支持空结构体这种东西(或者说我也没想好什么场合有用)

    struct s2
    {
    //      char a[]  = "hasd" ;
    //      int c;
    };
    int main()
    {
            struct s2 s22;
            struct s2 s23;
            struct s2 s24;
            struct s2 s25;
    }
    


    例外的是,C++唯独不给带弹性数组的结构体分配空间(可能怕和变长结构体机制产生某种冲突,比如大小怎么算):

    struct s
    {
            char b[] ;
    };

    struct s
    {
    //        char b[] ;
    };

    C++中两者是不一样的,空的结构体反而“大”(sizeof()返回1)
     

    20160321补充:这个机制利用了一个非常重要的特性——组和指针的区别!数组和指针在很多操作上是一样的,但是本质不一样。最直观的,指针可以改指向,数组不可以,因为数组占用的每一个内存地址都用来保存变量或者对象,而指针占用的内存地址保存的是一个地址,数组没有单独的保存指向地址的这样一个结构。数组的位置是固定的,正如指针变量自身的位置也是固定的,改的是指针的值,是指向的目标地址,而因为数组不存储目标地址,所以改不了指向。企图把地址强制赋值给数组的话,也只是说把指针赋值给数组,类型不兼容。

    结构体嵌套:

    结构体嵌套其实没有太意外的东西,只要遵循一定规律即可:

    //对于“一锤子买卖”,只对最终的结构体变量感兴趣,其中A、B也可删,不过最好带着
    struct A{ 
            struct B{
                 int c;
            }
            b;
    }
    a;
    //使用如下方式访问:
    a.b.c = 10; 
    

    特别的,可以一边定义结构体B,一边就使用上:

    struct A{
            struct B{
                    int c;
            }b;
            struct B sb;
    }a;
    

    使用方法与测试:

            a.b.c = 11;
            printf("%d\n",a.b.c);
            a.sb.c = 22;
            printf("%d\n",a.sb.c);
    结果无误。 

    但是如果嵌套的结构体B是在A内部才声明的,并且没定义一个对应的对象实体b,这个结构体B的大小还是不算进结构体A中。

    结构体与函数:

    关于传参,首先,把结构体中的int成员变量当做和普通int变量一样的东西来使用(当做函数参数),是不用脑子就想到的一种方法,如下:

    void func(int);
    func(a.b.c);

    另外的主要用法就是传递副本和指针了 :

    //20210805更新:用了能完整跑通的代码,降低了文章前后所需的连贯性,避免读者拼接代码编译不过——https://mp.csdn.net/mp_blog/creation/editor/23625823
    struct A {
        struct B {
            int c;
        }b;
        struct B sb;
    }a;
    
    //设立了两个函数,分别传递struct A结构体和其指针。
    void func1(struct A a) {//复制结构体
        printf("%d\n", a.b.c);
    }
    void func2(struct A* a) {//传递结构体指针
        printf("%d\n", a->b.c);
    }
    void func3(struct A& a) {//进阶:传递结构体引用,效用上近似结构体指针,但访问形式不同于指针
        printf("%d\n", a.b.c);
    }
    int main() {
        a.b.c = 112;
        struct A * pa;
        pa = &a;
        func1(a);
        func2(&a);
        func2(pa);
        func3(a);
    }

    注意:盗版是得不到更新迭代的(手动滑稽)https://blog.csdn.net/huqinweI987/article/details/23625823

    占用内存空间:

    struct结构体,在结构体定义的时候不能申请内存空间,不过如果是结构体变量,声明的时候就可以分配——两者关系就像C++的类与对象,对象才分配内存(不过严格讲,作为代码段,结构体定义部分“.text”真的就不占空间了么?当然,这是另外一个范畴的话题)。

    结构体的大小通常(只是通常)是结构体所含变量大小的总和,下面打印输出上述结构体的size:

            printf("size of struct man:%d\n",sizeof(struct man));
            printf("size:%d\n",sizeof(Huqinwei));
    结果毫无悬念,都是28:分别是char数组20,int变量4,浮点变量4. 

    下边说说不通常的情况:

    对于结构体中比较小的成员,可能会被强行对齐,造成空间的空置,这和读取内存的机制有关,为了效率。通常32位机按4字节对齐,小于的都当4字节,有连续小于4字节的,可以不着急对齐,等到凑够了整,加上下一个元素超出一个对齐位置,才开始调整,比如3+2或者1+4,后者都需要另起(下边的结构体大小是8bytes),相关例子就多了,不赘述。

    struct s
    {
    char a;
    short b;
    int c;
    }

    相应的,64位机按8字节对齐。不过对齐不是绝对的,用#pragma pack()可以修改对齐,如果改成1,结构体大小就是实实在在的成员变量大小的总和了。
    补一个代码,压入1字节对齐,定义s,然后弹出,使用默认,定义s2,两个结构体大小分别为7和8

    #include <stdio.h>
    #pragma pack(push,1)
    struct s
    {
            char a;
            short b;
            int c;
    };
    #pragma pack(pop)
    struct s2
    {
            char a;
            short b;
            int c;
    };
    
    
    
    int main(){
    
            printf("%ld\n",sizeof(struct s));
            printf("%ld\n",sizeof(struct s2));
    
    }
    
    $ ./a.out
    7
    8
    

    和C++的类不一样,结构体不可以给结构体内部变量初始化,。

    如下,为错误示范:

    #include<stdio.h>
    //直接带变量名Huqinwei
    struct stuff{
    //      char job[20] = "Programmer";
    //      char job[];
    //      int age = 27;
    //      float height = 185;
    }Huqinwei;
    

    PS:结构体的声明也要注意位置的,作用域不一样。

    C++的结构体变量的声明定义和C有略微不同,说白了就是更“面向对象”风格化,要求更低。

    那么熟悉了常用方法,都要注意哪些常犯错误呢,见C语言结构体常见错误

    =========================================================================

    如果感兴趣C++、计算机视觉、深度学习和SLAM与三维重建,可以关注作者学习交流。

    展开全文
  • c语言结构体学习整理(结构体初始化,结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    c语言中交换两个结构体的值(结构体指针) 1关于语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活...

    渣渣c的c语言学习之路

    1.关于c语言的结构体:

    首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。

    2首先我们要了解一些小知识

    2.1**只有结构体变量才分配地址,而结构体的定义是不分配空间的。**
    2.2结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间。
    2.3结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错
    2.4c语言中的结构体不能直接进行强制转换,只有结构体指针才能进行强制转换
    2.5相同类型的成员是可以定义在同一类型下的
    列如

    
    struct Student
    { 
    	int number,age;//int型学号和年龄
    	char name[20],sex;//char类型姓名和性别
    	float score;
    }

    最后的分号不要忘了 有的编译器会自动加上,因此有的同学就会不注意。

    3关于结构体变量的定义和引用

    在编译时,结构体的定义并不分配存储空间,对结构体变量才按其数据结构分配相应的存储空间

    
     struct Book
     { 
     	char title[20];//一个字符串表
    
    示的titile 题目
    	char author[20];//一个字符串表示的author作者
     	float value;//价格表示 
     };//这里只是声明 结构体的定义 
    struct Book book1,book2;//结构体变量的定义 分配空间
    
    book1.value;//引用结构体变量
    

    定义结构体变量以后,系统就会为其分配内存单元,比如book1和book2在内存中占44个字节(20+20+4)具体的长度你可以在你的编译器中使用sizeof关键字分别求出来。
    列如

    当然,要注意一点:用sizeof关键字求结构体长度时,返回的最大基本类型所占字节的整数倍 比方说我们上面求得的为44 为 float(4个字节)的整数倍,
    但是我们把title修改为title[22]; 这时正常长度为46 ,但是你会发现实际求得的为48,(4的整数倍)

    这就涉及到结构体的存储

    1结构体整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。

    2.结构体的每个成员相对结构体首地址的偏移量(offset)都是最大基本类型成员字节大小的整数倍,如果不是编译器会自动补齐,

    关于这个我们简单介绍下:

    1.偏移量----偏移量指的是结构体变量中成员的地址和结构体变量首地址的差。即偏移字节数,结构体大小等于最后一个成员的偏移量加上他的大小,第一个成员的偏移量为0,

    struct S1
    {
        char a;
    
        int b;
    
        double c;
    };
    

    这里char a 偏移量为1 之后为int b 因为偏移量1不为int(4)的整数倍,所以会自动补齐,而在 double c 时,偏移量为8 是double(8)的整数倍,所以不用自动补齐 最后求得结构体得大小为 16

    具体看下图:
    在这里插入图片描述
    通过上面的代码同学们应该会有一个简单的认知

    4结构体变量的初始化

    结构体的初始化有很多需要注意的地方,这里我们说明下
    首先是几种初始化的方法
    ps在对结构体变量初始化时,要对结构体成员一一赋值,不能跳过前面成员变量,而直接给后面成员赋初值,但是可以只赋值前面几个,对与后面未赋值的变量,如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’

    4.1定义时直接赋值

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1={"zhaozixuan",'M',12345};
    //或者
    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }struct Student stu1={"zhaozixuan",'M',12345};
    
    

    注意字符为‘ ’ 字符串为""
    4.2定义结构体之后逐个赋值

    stu1.name="王伟";
    stu1.sex='M';
    stu1.number=12305;
    //也可用strcpy函数进行赋值
    strcpy(stu1.name,"王伟");
    
    

    4.3定义之后任意赋值

     struct Student stu1={
      .name="Wang",
      .number=12345,
      .sex='W', 
     };//可以对任意变量赋值
    

    这样写的好处时不用按照顺序来进行初始化,而且可以对你想要赋值的变量直接进行赋值,而不想赋值的变量可以不用赋值

    需要注意的是如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了;

    等下结构体数组初始化时我们还会有一个讲解

    这里我们顺带提一下typedef说明结构体类型


    这里的BOOK就相当于struct book的一个别名一样,用它来定义结构体变量非常简便
    主要也是考二级要用到,所以我们简单介绍下

    5结构体变量的引用(输出和输入)

    5.1结构体变量的赋值用scanf赋值和printf输出时跟其他变量操作一样
    但是有几点需要注意
    (1) .是运算符,在所有运算符优先级中最高
    (2)如果结构体的成员本身是一个结构体,则需要继续用.运算符,直到最低一级的成员。

    struct Student
    {	char name[20];
    	char sex;
    	int number;
    	struct Date
    	{
    		int year;
     		int month;
     		int day;
    	}birthday;
    
    }stu1;
    printf("%d",stu1.birthday);//这样子是错误的,因为birthday也是一个结构体变量
    scanf("%d",&stu1.birthday.month);//正确
    

    (3)可以引用接头体变量成员的地址,也可以引用结构体变量的地址:

    printf("%o", student);(输出student的首地址)(%o 按八进制输出)

    6结构体数组及其初始化(重点)

    这里我们简单说下,具有相同类型的结构体变量组成数组就是结构体数组

    结构体数组与结构体变量区别只是将结构体变量替换为数组

    struct Student
    { 
    	char name[20];
    	char sex;
    	int number;
    }stu1[5]={
    	 {"zhaozixuan",'M',12345},
    	 {"houxiaohong",'M',12306},
    	 {"qxiaoxin",'W',12546},
    	 {"wangwei",'M',14679},
    	 {"yulongjiao",'W',17857}
    };
    stu1[3].name[3]//表示stu1的第三个结构变量中姓名的第五个字符
    //若初始化时已经是结构体数组全部元素[]中的数可以不写如stu1[]=
    

    注意结构体数组要在定义时就直接初始化,如果先定义再赋初值是错误的
    比如:

    struct Student stu1;
    stu1[3]={
      {"zhaozixuan",'M',12345},
      {"houxiaohong",'M',12306},
      {"qxiaoxin",'W',12546}
      };
      
    

    这样子是错误的,

    这里我在写的时候遇到一些问题,还是结构体数组初始化的问题,折腾了下解决了,给大家分享下
    对于数组初始化时
    比如

    char str[20];
    str="I love you";/* 这样会修改数组的地址,但是数组的地址分配之后是不允许改变的 */
    
    

    在第一条语句中 str就已经被定义成数组而在C99标准中不允许将字符串(实际上是一个指针变量) 赋值给数组,所以如果我们直接赋值是错误的

    那么怎么弄呢
    这里提供3种方法

    1.定义数组时直接定义
    char str[20]=“I love you”;

    2.用strcpy或者memset函数进行复制
    char str[20];
    strcpy(str,“I love you”);
    再用到memset函数时,出现了一些问题
    对于memcset函数简单介绍下

    memset
    void *memset(void *s,int c,size_t n)
    作用:将已开辟内存空间s的首n个字节的值设为值c。

    char str[20];
    memset(str,'a',20);
    

    如果是字符类型数组的话,memset可以随便用,但是对于其他类型的数组,一般只用来清0或者填-1,如果是填充其他数据就会出错

    int str[10];
    memset(str,1,sizeof(str));//这样是错误的
    
    

    这里我们说下这个错误,

    首先我们要知道memset在进行赋值时,是按字节为单位来进行赋值的,每次填充的数据长度为一个字节,而对于其他类型的变量,比如int,占4个字节 所以sizeof(str)=40; 而用memset赋值时,将会对指向str地址的前40个字节进行赋值0x01(00000001) 的操作,把0x00000000赋值4次0x01操作变为0x01010101(00000001000000010000000100000001)

    相当于给“前10个int”进行了赋值0x01010101的操作 对应十进制的16843009
    所以会出很大的错误

    这里请务必要注意,但是如果是清零一个数组用memset还是很方便的
    简单使用的话同学们用strcmp函数就行

    3用指针(注意内存分配)
    char *str;
    str=“I love you”;

    这两句话的本质是,在内存中开辟一段内存空间,把"I love you"放进这段内存空间,然后把这段内存空间的地址交给str,由于str是变量,所以给它赋值是合法的。

    请注意,在我们进行数组初始化的时候如果定义的数组过长,而我们只初始化了一部分数据,对于未初始化的数据如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即‘\0’ 即不足的元素补以默认值
    这里我们在4小节中也提到了
    比如

    int str[10]={1};//这里只是把str的第一个元素赋值为1,其他元素默认为0
    
    



    7结构体与指针

    我们知道,指针指向的是变量所占内存的首地址,在结构体中,指针指向的是结构体变量的起始地址,当然也可指向结构体变量的元素
    这里我们分为三部分
    7.1指向结构体变量的指针

    定义形式一般为
    struct 结构体名* 指针名;
    比如: struct Student* p;

    struct Student
    {	
    	char cName[20];
     	int number;
     	char csex;  
    }student1;
    struct Student*p;
    p=&student1;
    //若为结构体数组则
    struct Student stu1[5];
    struct Student*p;
    p=stu1;//因为stu1为结构体数组而p=stu1直接是指向stu1的首地址,就不用再加&符
    
    

    用结构体指针变量访问结构体变量成员有以下两种方式:
    (*p).cName //这里的括号不能少,在5.1中有提到
    p->cName

    简单来说以下三种形式是等价的

    p->cName
    (*p).cName 
    student1.cName
    p->cName //可以进行正常的运算
    

    p->number++; 是将结构体变量中number的值进行运算,然后再加一,
    这里要注意下,等下在7.2中会有比较

    7.2指向结构体数组的指针

    7.1中我们已经提到结构体数组指针的命名,这里我们仅对一些知识点做下介绍
    这里我们接着来说结构体数组指针
    在我们想要用指针访问结构体数组的第n个数据时可以用

    struct Student stu1[5];
    struct Student*p;
    p=stu[n];
    (++p).number//是指向了结构体数组下一个元素的地址
    
    

    7.3结构体成员是指针类型变量
    比如

    struct Student
    {
     	char* Name;//这样防止名字长短不一造成空间的浪费
     	int number;
     	char csex;  
    }student1;
    
    

    在使用时可以很好地防止内存被浪费,但是注意在引用时一定要给指针变量分配地址,如果你不分配地址,结果可能是对的,但是Name会被分配到任意的一的地址,结构体不为字符串分配任何内存存储空间具有不确定性,这样就存在潜在的危险,

    struct Student
    {
     	char* Name;
     	int number;
     	char csex;  
    }stu,*stu;
    
    stu.name=(char*)malloc(sizeof(char));//内存初始化
    

    这里我们说一下,同学们看书的时候一般不会看到,
    如果我们定义了结构体指针变量,他没有指向一个结构体,那么这个结构体指针也是要分配内存初始化的,他所对应的指针类型结构体成员也要相应初始化分配内存

    struct Student
    {
     	char* Name;
     	int number;
    	char csex;  
    }stu,*stu;
    stu = (struct student*)malloc(sizeof(struct student));./*结构体指针初始化*/
      stu->name = (char*)malloc(sizeof(char));/*结构体指针的成员指针同样需要初始化*/  
    
    

    7.4二叉树遍历算法
    二叉树的二叉链表类型定义如下:
    typedef struct btnode {
    datatype data;
    struct btnode *lchild,*rchild;
    };
    这里我们仅仅提出以下,因为涉及到链表,感兴趣的同学可以去学习下(二级要用),
    7.5结构体作为函数参数

    首先我们要注意的一点,使用结构体变量作为函数参数的时候,采取的是值传递的方式,将结构体所占内存单元的内容全部传递给形参,并且形参必须也要是同类型的结构体变量,在使用时,会自动创建一个结构体变量作为原变量的副本,并且也需要占内存,并且在调用期间如果修改(形参)结构体中成员的值,修改值是无效的

    而如果用指针作为实参,传递给函数的形参,这时候传递的是结构体的地址,形参所指向的地址就是结构体变量的地址,这时候进行修改的话是可以修改的,这正是指针的精华所在

    在这里我们再提供几种互换两个结构体的方法

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }student1,student2;
    struct Student student1={"Wang",12345,'W'};
    struct Student student2={"Zhao",54321,'M'}; 
    struct Student*stu1=&student1;
    struct Student*stu2=&student2;
    
    struct Student *student3;
    student3=stu1;
    stu1=stu2;
    stu2=student3;//互换地址
    
    2对于同类型结构体直接互换值就行
    struct stu student3;
    student3=student1;
    student1=student2;
    student2=student3;
    //这里也可以写成应strcmp函数互换
    
    3memcpy()函数进行互换
    
    
    4比较笨的方法: 用for循环互换
    

    最后提下memset清空结构体

    struct Student
    {
     char cName[20];
     int number;
     char csex;  
    }stu1;
    
    一般情况下,清空str的方法:
      str.cName[0]='\0';
      str.csex='0';
      str.number=0;
      但是我们用memset就非常方便:
      memset(&str,0,sizeof(struct Student));
      如果是数组:
      struct Student stu[10];
      就是
      memset(stu,0,sizeof(struct Student)*10);
    

    整理不易,点个赞再走呗!

    展开全文
  • 结构体

    2011-07-14 20:45:37
    结构体
  • 结构体的定义与使用 结构体是一种构造数据类型 把不同类型的数据组合成一个整体 结构体的定义形式: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的...

    1.结构体的定义与使用

    • 结构体是一种构造数据类型
    • 把不同类型的数据组合成一个整体

    结构体的定义形式:

    struct 结构体名{
        结构体所包含的变量或数组
    };

    结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。请看下面的一个例子:

    struct stu{
        char name[];  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在学习小组
        float score;  //成绩
    };

    注意:大括号后面的分号;不能少,这是一条完整的语句。

    stu 为结构体名,它包含了 5 个成员,分别是 name、num、age、group、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化

    结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。
    像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。

    • 先定义结构体类型,再定义结构体变量
     struct   student 
    {       
     int num;
     char  name[20];
     char sex;
     int age; 
     float score;
     char addr[30];
     };
     struct student stu1,stu2;         
    • 定义结构体类型的同时定义结构体变量
     struct   data
     {      
      int day int month;
      int year
     }time1,time2; 
    • 直接定义结构体变量
     struct 
    {
     char name[20];
     char sex; 
     int num; 
     float score[3]
     }person1,person2; 

    2.结构体变量的初始化

    和其它类型变量一样,对结构体变量可以在定义时指定初始值。

    #include <stdio.h>
     
    struct Books
    {
       char  title[50];
       char  author[50];
       char  subject[100];
       int   book_id;
    } book = {"C 语言", "RUNOOB", "编程语言", 123456};
     
    int main()
    {
        printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
    }

    输出结果:

    title : C 语言
    author: RUNOOB
    subject: 编程语言
    book_id: 123456

    3.访问结构成员

    为了访问结构的成员,我们使用成员访问运算符(.)

    引用形式:<结构体类型变量名>.<成员名>

    注意:结构体变量不能整体引用,只能引用变量成员

    成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。可以使用 struct 关键字来定义结构类型的变量。下面的实例演示了结构的用法:

    #include <stdio.h>
    int main(){
        struct{
            char *name;  //姓名
            int num;  //学号
            int age;  //年龄
            char group;  //所在小组
            float score;  //成绩
        } stu1;
    
        //给结构体成员赋值
        stu1.name = "Tom";
        stu1.num = 12;
        stu1.age = 18;
        stu1.group = 'A';
        stu1.score = 136.5;
    
        //读取结构体成员的值
        printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
    
        return 0;
    }

    运行结果:
    Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!

    除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如: 

    struct{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };

    不过整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。

    需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。

    4.结构作为函数参数

    可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。例如:

    #include <stdio.h>
    #include<string.h>
    
    struct Books
    {
    	char title[50];
    	char author[50];
    	char subject[100];
    	int book_id;
    };
    
    void printBook(struct Books book);//函数声明
    
    int main()
    {
    	struct Books Book1;//声明Book1,类型为Books
    	struct Books Book2;
    
    	/* Book1 详述 */
    	strcpy(Book1.title, "C Programming");
    	strcpy(Book1.author, "Nuha Ali");
    	strcpy(Book1.subject, "C Programming Tutorial");
    	Book1.book_id = 6495407;
    	printBook(Book1);
    	return 0;
    }
    void printBook(struct Books book)
    {
    	printf("Book title:%s\n", book.title);
    	printf("Book author:%s\n", book.author);
    	printf("Book subject:%s\n", book.subject);
    	printf("Book book_id:%d\n", book.book_id);
    }

    运行结果:

    Book title:C Programming
    Book author:Nuha Ali
    Book subject:C Programming Tutorial
    Book book_id:6495407

    5.结构体数组

    所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。

    定义结构体数组和定义结构体变量的方式类似,请看下面的例子:

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组 
        float score;  //成绩
    }class[5];
    //表示一个班有5个人

    结构体数组在定义的同时也可以初始化,例如:

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组 
        float score;  //成绩
    }class[5] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };

    当对数组中全部元素赋值时,也可以不给出数组长度,如:

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组 
        float score;  //成绩
    }class[] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };

    结构体数组的使用也很简单。例如,计算全班学生的总成绩、平均成绩和140分一下的人数:

    #include <stdio.h>
    
    struct{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    }class[] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };
    
    int main(){
        int i, num_140 = 0;
        float sum = 0;
        for(i=0; i<5; i++){
            sum += class[i].score;
            if(class[i].score < 140) num_140++;
        }
        printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
        return 0;
    }

    运行结果:

    sum=707.50
    average=141.50
    num_140=2

    6.指向结构的指针

    可以定义指向结构的指针,方式与定义指向奇特类型变量的指针类似,

    定义形式:struct 结构体名 *结构体指针名;

    struct Books *struct_pointer;

    定义之后可以在上述定义的指针变量中存储结构变量的地址。例:

    struct_pointer = &Book1;

    为了使用指向该结构的指针访问结构的成员,必须使用->运算符,如下所示:

    struct_pointer->title;

    定义结构体指针的实例:

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1 = { "Tom", 12, 18, 'A', 136.5 };
    //结构体指针
    struct stu *pstu = &stu1;

    也可以在定义结构体的同时定义结构体指针:

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;

    注意:结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&符号,所以给p赋值只能写成

    struct stu *p=&stu1;

    而不能写成:

    struct stu *p=stu1;

    注意:结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。下面的写法是错误的,不可能去取一个结构体名的地址,也不能将它赋值给其他变量:

    struct stu *pstu = &stu;
    struct stu *p=stu;

    7.获取结构体成员

    通过结构体指针可以获取结构体成员,一般形式为:

    (*pointer).memberName

    或者:

    pointer->memberName

    第一种写法中,.的优先级高于*,(*pointer)两边的括号不能少,如果去掉括号写成*pointer.memberName,那么就等效于*(pointer.memberName),这样意义就不对了。

    第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员,这也是->在C语言中的唯一用途。

    上面两种写法是等效的,我们通常采用第二种写法,这样更加直观。

    实例:结构体指针的使用

    #include <stdio.h>
    int main(){
        struct{
            char *name;  //姓名
            int num;  //学号
            int age;  //年龄
            char group;  //所在小组
            float score;  //成绩
        } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
    
        //读取结构体成员的值
        printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
        printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
    
        return 0;
    }

    运行结果:

    Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
    Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!

    示例:结构体数组指针的使用

    #include <stdio.h>
    
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    }stus[] = {
        {"Zhou ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"Liu fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    }, *ps;
    
    int main(){
        //求数组长度
        int len = sizeof(stus) / sizeof(struct stu);
        printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
        for(ps=stus; ps<stus+len; ps++){
            printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
        }
    
        return 0;
    }

    运行结果:

    Name            Num     Age     Group   Score
    Zhou ping       5       18      C       145.0
    Zhang ping      4       19      A       130.5
    Liu fang        1       18      A       148.5
    Cheng ling      2       17      F       139.0
    Wang ming       3       17      B       144.5

    参考资料:

    C语言结构体和指针

    C语言结构体数组

    C结构体

    展开全文
  • C++ 结构体初始化与赋值

    万次阅读 多人点赞 2016-05-30 13:28:57
    1.CC++结构体的初始化今天看到项目中对自定义结构体初始化方式有点陌生,特在此罗列一下可用的结构体初始化的方式。对结构体struct A { int b; int c; }有几种初始化方式:第一种:struct A a = { .b = 1, ...

    在这里插入图片描述

    1.结构体初始化

    结构体是常用的自定义构造类型,是一种很常见的数据打包方法。结构体对象的初始化有多种方式,分为顺序初始化、指定初始化、构造函数初始化。假如有如下结构体。

    struct A {
    	int b;
    	int c;
    };
    

    (1)顺序初始化因为书写起来较为简约,是我们最常用的初始化方式,但相对于指定初始化,无法变更数据成员初始化顺序,灵活性较差,而且表现形式不直观,不能一眼看出 struct 各个数据成员的值。

    A a = {1, 2};
    

    (2)指定初始化(Designated Initializer)实现上有两种方式,一种是通过点号加赋值符号实现,即“.fieldname=value”,另外一种是通过冒号实现,即“fieldname:value”,其中 fieldname 为结构体成员名称 。前者是 C99 标准引入的初始化方式,后者是 GCC 的扩展。遗憾的是有些编译器并不支持指定初始化,比如 Visual C++。

    // 点号+赋值符号
    A a = {.b = 1, .c = 2};
    
    //冒号
    A a = {b:1, c:2};
    

    Linux 内核喜欢用 .fieldname=value 的方式进行初始化,使用指定初始化,一个明显的优点是成员初始化顺序和个数可变,并且扩展性好,比如在结构体非末尾处增加字段时,避免了传统顺序初始化带来的大量修改。

    (3)构造函数初始化常见于 C++ 代码中,因为 C++ 中的 struct 可以看作 class,结构体也可以拥有构造函数,所以我们可以通过结构体的构造函数来初始化结构体对象。给定带有构造函数的结构体:

    struct A {
    	A(int b,int c) {
    		this->b=b;
    		this->c=c;
    	};
    	int b;
    	int c;
    }
    

    那么结构体对象的初始化可以像类对象初始化那样:

    A a(1,2);
    

    注意: struct 如果定义了构造函数的话,就不能用大括号进行初始化了,即不能再使用指定初始化与顺序初始化了。

    2.结构体赋值

    变量的赋值和初始化是不一样的,初始化是在变量定义的时候完成的,是属于变量定义的一部分,赋值是在变量定义完成之后想改变变量值的时候所采取的操作。还是给定结构体 A:

    struct A {
    	int b;
    	int c;
    };
    

    注意: 结构体变量的赋值是不能采用大括号的方式进行赋值的,例如下面的赋值是不允许的。

    A a;
    a={1,2};	// 错误赋值
    

    下面列出常见结构体变量赋值的方法。

    (1)使用 memset 对结构体变量进行置空操作:

    // 按照编译器默认的方式进行初始化(如果 a 是全局静态存储区的变量,默认初始化为0,如果是栈上的局部变量,默认初始化为随机值)
    A a; 
    memset(&a,0,sizeof(a));
    

    (2)依次给每一个结构体成员变量进行赋值:

    A a; 
    a.b=1;
    a.c=2;
    

    (3)使用已有的结构体变量给另一个结构体变量赋值。也就是说结构体变量之间是可以相互赋值的。

    A a = {1,2};
    struct A a1;
    a1=a; 				// 将已有的结构体变量赋给a1
    

    初始化与赋值有着本质的区别,初始化是变量定义时的第一次赋值,赋值则是定义之后的值的变更操作,概念上不同,所以实现上也不一样。


    参考文献

    2016腾讯春季校园实习招聘技术岗初试(一面)问题汇总(CC++后台)
    结构体初始化
    C结构体-designated initializer
    C语言结构体声明中冒号的使用(占位符) & C结构体的乱序初始化

    展开全文
  • 结构体&结构体数组

    万次阅读 多人点赞 2018-08-16 18:17:39
    1、结构体的定义 struct 结构体类型名 { 类型名 成员名; 类型名 成员名; …… }; 先声明结构体类型,再定义结构体变量名 声明结构体类型,不分配空间 定义结构体类型变量,就要分配内存空间 1)结构体被...
  • C语言中的结构体结构体中数组初始化与赋值

    万次阅读 多人点赞 2018-01-03 10:18:33
    结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论; 1.结构体的定义和赋值 结构体是可以直接初始化的,在定义的时候,就可
  • C语言结构体(struct)最全的讲解(万字干货)

    万次阅读 多人点赞 2020-02-15 13:16:22
    结构体的定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。 结构体和其他类型基础数据类型一样,例如int类型,char类型只不过结构体可以做成你想要的数据类型。以方便...
  • 结构体定义 typedef struct 用法详解和用法小结

    万次阅读 多人点赞 2018-07-31 22:25:48
    typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node{ }这样来定义结构体的话。在定义 node 的结构体变量时,需要这样写:struct node n; 若用typedef,可以这样写:typedef struct node{}NODE;...
  • C语言结构体初始化的四种方法

    万次阅读 多人点赞 2018-03-15 17:17:19
    定义 struct InitMember { int first; double second; char* third; float four; }; 方法一:定义时赋值 struct InitMember test = {-10,3.141590,"...方法二:定义后逐个...
  • 计算机结构体

    2014-08-24 15:00:24
    结构体
  • c语言基础语法六——结构体(完结)

    万次阅读 多人点赞 2016-12-24 14:47:25
    关于c语言结构体的引入; 在前面已经介绍了整形(int,long,….),浮点型(flaot,double),字符型(char),还介绍了数组(存储一组具有相同类型的数据),字符串。但是在实际问题中只有这些数据类型是不够的,...
  • 结构体结构体链表

    万次阅读 多人点赞 2018-08-24 16:12:07
    在c语言表针中有多种数据类型,他们的应用使变量的应用... 结构体是一种类型,他的应用和int,float等变量类型的应用方法一致,切记,结构体是一种类型,不可当作变量进行使用。 在结构体类型使用时要先进行结构体...
  • 结构体 结构体: 一系列不同类型的数据的结合 强调:类型!= 变量。 结构体名代表的只是结构体类型,没有内存空间。 结构体中的成员可以单独使用 1 定义结构体 struct Studet { char name[20]; int age; char ...
  • Swift 结构体

    2021-01-06 02:58:17
    Swift 结构体 Swift 结构体是构建代码所用的一种通用且灵活的构造体。 我们可以为结构体定义属性(常量、变量)和添加方法,从而扩展结构体的功能。 与 C 和 Objective C 不同的是: 结构体不需要包含实现文件和...
  • 结构体变量作为函数参数,是将实参值传递给形参,属于值传递。将结构体所有参数传递给形参使用,但本身的值不会改变。将指向结构体变量的指针作为实参进行传递时,是将结构体变量的地址传递给形参,属于地址传递,...
  • 结构体嵌套结构体

    千次阅读 2020-08-05 18:06:11
    作用:结构体成员可以是另一个结构体 例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体 #include<iostream> #include<cstring> using namespace std; //1.要先创建学生数据类型:...
  • 1.结构体转map 2.map转结构体 3.结构体数据转移到结构体 4.json字符串转结构体 package main import ( encoding/json fmt reflect ) type User struct { Name string `json:name` Age int `json:age` } func ...
  • c代码-C结构体04:基础、结构体中存放结构体
  • windows CSHARP 结构体 UDP socket 传输

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 616,181
精华内容 246,472
关键字:

结构体