c c struct - yaokun123/php-wiki GitHub Wiki

结构体

结构体是复合类型,把多个相同或不同类型的数据存放在一块连续的内存中

一、结构体定义和初始化

定义结构体时,它只是一个类型(模版),没有空间,不可以给结构体成员赋值

//关键字 struct 代表这是一个结构体类型
//stu是这个结构体的名字
//整个结构体的类型是struct stu
struct stu{
    int id;
    int age;
    char name[128];
};

定义结构体同时定义变量

struct stu{
    int id;
    int age;
    char name[128];
} a,b;//定义类型时,同时定义了两个结构体变量struct stu a,b;

二、结构体变量的赋值

通过结构体变量操作成员,使用点域.操作

通过结构体地址操作成员,使用->

#include<stdio.h>
#include<string.h>

struct stu{
    int id;
    int age;
    char name[128];
};

int main(){

    struct stu a = {//全部成员初始化
        1,
        20,
        "test"
    };

    struct stu b = {//给部分成员初始化,其他成员内容为0
        .age = 18
    };

    //通过结构体变量操作成员,使用点域.操作
    struct stu c;
    c.age = 28;
    c.id = 520;
    //c.name = "haha";//数组名是一个常量,不能这么赋值
    strcpy(c.name,"haha");
    printf("%d %d %s\n",c.id,c.age,c.name);


    //通过结构体地址操作成员,使用->
    struct stu d;
    (&d)->id = 100;
    (&d)->age = 18;
    strcpy((&d)->name,"hello world");
    printf("%d %d %s\n",(&d)->id,(&d)->age,(&d)->name);
    return 0;
}

相同类型的变量是可以相互赋值的

#include<stdio.h>
#include<stdio.h>
#include<string.h>

struct stu{
    int id;
    int age;
    char name[128];
};
struct h_stu{
    struct stu s;
    char subject[128];
};

int main(){
    struct stu a = {1,20,"hello"};
    struct stu b;
    b = a;//相同类型的变量是可以相互赋值的,其实就是调用memcpy
    printf("%d %d %s",b.id,b.age,b.name);

    return 0;
}

三、结构体数组

是一个数组,数组中的每个元素都是结构体

#include<stdio.h>
#include<string.h>

struct stu{
    int id;
    int age;
    char name[128];
};

int main(){

    struct stu num[5] = {{1,18,"test1"},{2,20,"test2"},{3,22,"test3"},{4,24,"test4"},{5,26,"test5"}};
    printf("%lu %lu\n",sizeof(num),sizeof(num[0]));//680 136这里不是单纯的4+4+128,还涉及到结构体的内存对齐问题

    for(int i = 0; i < sizeof(num)/sizeof(num[0]); i++){
        printf("%d %d %s\n",num[i].id,num[i].age,num[i].name);
    }
    return 0;
}

四、结构体嵌套

#include<stdio.h>
#include<string.h>

struct stu{
    int id;
    int age;
    char name[128];
};
struct h_stu{
    struct stu s;
    char subject[128];
};

int main(){

    struct h_stu h;
    h.s.id = 1;
    h.s.age = 22;
    strcpy(h.s.name,"helloworld");
    strcpy(h.subject,"php");

    printf("%d %d %s %s",h.s.id,h.s.age,h.s.name,h.subject);
    return 0;
}

五、结构体指针

#include<stdio.h>
#include<string.h>

struct stu{
    int id;
    int age;
    char name[128];
};
struct h_stu{
    struct stu s;
    char subject[128];
};

int main(){
    struct stu a = {1,20,"hello"};

    struct stu *p = &a;//结构体指针

    printf("%d %d %s\n",p->id,p->age,p->name);
    return 0;
}

六、结构体套指针

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct tea{
    int id;
    char *p;
};
int main(){
    struct tea tmp;
    printf("%lu\n",sizeof(tmp));//16

    struct tea *p = (struct tea *)malloc(sizeof(struct tea));

    p->id = 1;
    //p->p = "hello";//或
    p->p = (char *)malloc(sizeof(char));
    strcpy(p->p,"hello");

    printf("%d %s\n",p->id,p->p);

    return 0;
}

------------------------------------------------------------------------

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct t{
    int a;
};
struct tea{
    int id;
    char *p;
    struct t *k;
};
int main(){
    struct tea *p = (struct tea *)malloc(sizeof(struct tea));
    p->p = (char *)malloc(sizeof(char));
    strcpy(p->p,"hello");
    p->k = (struct t *)malloc(sizeof(struct t));
    p->k->a = 100;

    return 0;
}
⚠️ **GitHub.com Fallback** ⚠️