C语言中的结构体的入门学习教程

2020-01-06 14:15:01于丽
struct stuff *ref = &Huqinwei; ref->age = 100; printf("age is:%dn",Huqinwei.age);

打印可见变化 
指针也是一样的


    struct stuff *ptr;
    ptr->age = 200;
    printf("age is:%dn",Huqinwei.age);

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


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 : %dn",sizeof(schangeable));

    schangeable *pchangeable = (schangeable *)malloc(sizeof(schangeable) + 10*sizeof(char));
    printf("size of pchangeable : %dn",sizeof(pchangeable));

    schangeable *pchangeable2 = (schangeable *)malloc(sizeof(schangeable) + 20*sizeof(char));
    pchangeable2->iCnt = 20;
    printf("pchangeable2->iCnt : %dn",pchangeable2->iCnt);
    strncpy(pchangeable2->pc,"hello world",11);
    printf("%sn",pchangeable2->pc);
    printf("size of pchangeable2 : %dn",sizeof(pchangeable2));
}

运行结果


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

结构体本身长度就是一个int长度(这个int值通常只为了表示后边的数组长度),后边的数组长度不计算在内,但是该数组可以直接使用。
(说后边是个指针吧?指针也占长度!这个是不占的!原理很简单,这个东西完全是数组后边的尾巴,malloc开辟的是一片连续空间。其实这不应该算一个机制,感觉应该更像一个技巧吧)

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


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

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