美文网首页
C 结构体 struct 共用体union

C 结构体 struct 共用体union

作者: 放肆滴微笑 | 来源:发表于2019-12-16 20:40 被阅读0次

结构体是一种构造数据类型,把不同的数据类型整合起来称为一个自定义的数据类型

结构体的写法
基本写法,设置别名,匿名结构体,嵌套结构体

// 基本使用
struct Man {
    char name[20];
    int age;
};

// 结构体设置别名,可以直接使用别名(变量名),也可以直接进行初始化
struct Man1 {
    char name[20];
    int age;
} man1, man11 = {"张三", 20}; //man11 直接赋值

// 匿名结构体
struct {
    char name[20];
    int age;
} man2;

struct Teacher {
    char name[20];
};
// 结构体嵌套
struct Student {
    char name[20];
    struct Teacher t;
};

struct StudentSup {
    char name[20];
    struct TeacherSup {
        char name[20];
    } tSup;
};

int main() {
    //基本使用  直接赋值  在栈中定义过了
    struct Man man = {"Man", 20};
    // 声明变量,根据属性赋值
    struct Man man_;
    strcpy(man_.name, "copyMan");
    man_.age = 21;
    printf("man的赋值 name=%s age=%d\n", man.name, man.age);
    printf("man_变量的赋值 name=%s age=%d\n", man_.name, man_.age);

    strcpy(man1.name, "我是别名man1");
    man1.age = 22;
    printf("man1 别名的赋值 name=%s age=%d\n", man1.name, man1.age);
    printf("man1 别名初始化的赋值 name=%s age=%d\n", man11.name, man11.age);

    strcpy(man2.name, "我是匿名结构体");
    man2.age = 23;
    printf("匿名结构体的赋值 name=%s age=%d\n", man2.name, man2.age);

    struct Student student = {"李四", {"王老师"}};
    printf("嵌套结构体  老师=%s 学生=%s\n", student.t.name, student.name);

    struct Student student1;
    strcpy(student1.name, "变量赋值");
    strcpy(student1.t.name, "老师变量赋值");
    printf("嵌套结构体 变量赋值  老师=%s 学生=%s\n", student1.t.name, student1.name);

    struct StudentSup studentSup;
    strcpy(studentSup.name, "内部嵌套的学生");
    strcpy(studentSup.tSup.name, "内部嵌套的老师");

    printf("内部嵌套结构体   老师=%s 学生=%s\n", studentSup.tSup.name, studentSup.name);
}


man的赋值 name=Man age=20
man_变量的赋值 name=copyMan age=21
man1 别名的赋值 name=我是别名man1 age=22
man1 别名初始化的赋值 name=张三 age=20
匿名结构体的赋值 name=我是匿名结构体 age=23
嵌套结构体  老师=王老师 学生=李四
嵌套结构体 变量赋值  老师=老师变量赋值 学生=变量赋值
内部嵌套结构体   老师=内部嵌套的老师 学生=内部嵌套的学生

结构体指针

结构体指针 -> 是 *p 的简写

struct Man {
    char name[20];
    int age;
};

void main() {
    struct Man man = {"张三", 20};
    struct Man *p = &man;
    // 结构体指针   -> 是 *p 的简写
    printf("name=%s,age=%d\n",p->name,p->age);
    printf("name=%s,age=%d\n",(*p).name,(*p).age);
    printf("name=%s,age=%d\n",man.name,man.age);
}

结构体数组和指针

struct Man {
    char name[20];
    int age;
};

void main() {
    struct Man mans[] = {{"张三", 20},
                         {"李四", 20}};
    struct Man *p = mans;

    for (; p < mans + 2; p++) {
        printf("%s,%d\n", p->name, p->age);
    }

    //sizeof(mans) 是 结构体数组的大小  
    //sizeof(struct Man) 是结构体的大小
    // 结构体的大小,必须是最大基本类型的整数倍
    int i = 0;
    for (; i < sizeof(mans) / sizeof(struct Man); i++) {
        printf("%s,%d\n", mans[i].name, mans[i].age);
    }
}

结构体的大小,必须是最大基本类型的整数倍

动态加载结构体

struct Man {
   char name[20];
   int age;
};

void main() {
   struct Man *man = (struct Man *) malloc(sizeof(struct Man) * 10);
   struct Man *p = man;
   // p 指针 对man指针进行赋值
   strcpy(p->name, "wx");
   p->age = 18;
   p++;
   strcpy(p->name, "wx1");
   p->age = 19;
   // loop_p指针等于 man ,并对loop进行循环
   struct Man *loop_p = man;
   for (; loop_p < man + 2; loop_p++) {
       printf("%s,%d\n", loop_p->name, loop_p->age);
   }
   // 动态加载要手动释放
   free(man);
   man = NULL;
}

typedef 类型取别名 书写简单 结构体名和别名一样,少些struct

typedef int Jint; // int类型别名
typedef int *pInt; // int指针类型 别名

typedef struct Man {
    char name[20];
    int age;
} W, *Wp; // w是结构体的别名  *wp是结构体的指针别名

void main() {
    int i=10;
    Jint jint = 15;
    pInt p = &i;
    W w = {"张三",20};
    Wp wp = &w;

    printf("int 指针别名 的值=%d\n",*p);
    printf("man 指针%s,%d",wp->name,wp->age);
}

结构体函数指针

struct Man {
    char name[20];
    int age;
    // 返回值  方法名    传递参数
    void (*fun_name)(char *);
};



void fun(char *c) {
    printf("c 的值%s\n", c);
}

void main() {
    struct Man man;
    strcpy(man.name, "我是结构体函数");
    man.age = 20;
    man.fun_name = fun;
    man.fun_name("我是函数指针");
    printf("name = %s", man.name);
}

c 的值我是函数指针
name = 我是结构体函数

结构体指针取别名

typedef struct Girl{
    char *name;
    int age;
    //函数指针
    void(*sayHi)(char*);
}Girl;

//Girl结构体指针取别名GirlP
typedef Girl* GirlP;

void sayHi(char* text){
    MessageBoxA(0, text, "title", 0);
}

//改名
void rename(GirlP gp1){
    gp1->name = "Lily";
}

void main(){
    Girl g1 = { "Lucy", 18, sayHi };
    GirlP gp1 = &g1;
    gp1->sayHi("Byebye!");
    //传递指针,改名
    rename(gp1);

    getchar();
}

相关文章

  • 三、C语言基础

    A、struct 结构体 结构体:里面所有的成员,默认都是public B、pragma C、union 共用体/...

  • C&C++常用方法笔记 -结构体联合体

    结构体 struct 联合体union union,中文名“联合体、共用体”,在某种程度上类似结构体struct的...

  • C 结构体 struct 共用体union

    结构体是一种构造数据类型,把不同的数据类型整合起来称为一个自定义的数据类型 结构体的写法基本写法,设置别名,匿名结...

  • 嵌入式第十天:结构

    今天来说一下C语言里的结构体(struct)、共用体(l联合体)union、枚举。欢迎加入嵌入式学习群:55960...

  • 5.29小结

    上午的课程主要有四部分内容。首先,老师讲述结构体和共用体。结构体的关键字为struct,共用体的关键字为union...

  • C语言和OC的结构体(struct)

    Struct(结构体) 1.结构体定义 2.结构体变量 3.结构体数组 4.C语言结构体指针 5.C语言共用体 6...

  • C++的共用体使用场景

    C++使用union 描述 union是C语言中一种声明共用体的数据类型,使用union声明的共用体只会占用共用体...

  • iOS共用体

    iOS共用体 一、何为共用体 在C语言中有union联合体/共用体。 union中可以定义多个成员,union的大...

  • 2018-05-29

    5月29日 上课的第二十一天。今天主要讲了结构体和共用体。结构体的关键字为struct,共用体的关键字为union...

  • C语言的一些符号含义、 函数含义

    union:共用体/联合体 union 共用体名{成员列表};类似结构体,是一群变量的集合,和集合不同的是: 共用...

网友评论

      本文标题:C 结构体 struct 共用体union

      本文链接:https://www.haomeiwen.com/subject/sbvfnctx.html