page contents

C语言基础——如何抽象世界

我们观察现实世界的时候,可以发现很多的东西它都是由不同的部分组合起来的。比如手机由电池、屏幕、芯片等很多个部分组成。同时对于一个电池它又是由很多的其他东西组成。结构体就是把这些东西组合在一起,进行统一的访问和管理。可以理解成是对现实世界的抽象 结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。

结构体类型

什么是结构体

我们观察现实世界的时候,可以发现很多的东西它都是由不同的部分组合起来的。比如手机由电池、屏幕、芯片等很多个部分组成。同时对于一个电池它又是由很多的其他东西组成。结构体就是把这些东西组合在一起,进行统一的访问和管理。可以理解成是对现实世界的抽象 结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。

定义结构体

struct 数据类型名{
   //结构体数据成员列表
};
复制代码

示例

struct Student{
    char * name;
    char * gender;
    char * mail;
    int age;
};
复制代码

声明结构体变量

方式一

struct Student student复制代码

方式二

struct Student {
    char name[10];
    char * gender;
    char * mail;
    int age;
} stu;
复制代码

方式三

struct {
    char * name;
    char * gender;
    char * mail;
    int age;
} stu;

//之后无法再继续定义变量
复制代码

结构体变量的初始化

结构体定义时初始化

struct Student
{
    char name[10];
    char *gender;
    char *mail;
    int age;
} student = {"泱澈", "男", "2633218009@qq.com", 21};
复制代码

变量定义时初始化

struct Student stu;

// 此时需要进行类型转换
stu = (struct Student){
        "泱澈",
        "男",
        "2633218009@qq.com",
        21
    };

//部分初始化
struct Student stu = {.name = "泱澈"};
复制代码

单个进行赋值

//对数组类型的数据不能直接赋值 例如 stu.name = "泱澈";
    strcpy(stu.name,"泱澈");
    stu.age = 21;
    stu.gender = "男";
复制代码

结构体变量的使用

我们使用 变量.成员字段 来使用结构体的数据成员

    strcpy(stu.name,"泱澈");
    stu.age = 21;
    stu.gender = "男";
    stu.mail = "2633218009@qq.com";

    printf("%s\n", stu.name);
    printf("%s\n", stu.gender);
    printf("%s\n", stu.mail);
    printf("%d\n", stu.age);
复制代码

结构体数组

语法定义

    struct Student{
        char * name;
    }stu[5];
复制代码

使用上与单个结构体变量相同,在数组中需要加上在数组中的下标

使用示例

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

struct Student
{
    char * name;
};

int main()
{
    struct Student stu[2];
    stu[0] = (struct Student){"泱澈"};

    printf("%s\n", stu[0].name);
    return 0;
}
复制代码

结构体指针

指向结构体类型的指针

使用示例

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

struct Student
{
    char * name;
};

int main()
{
    struct Student stu = {"泱澈"};
    struct Student * p;
    p = &stu;

    printf("%s\n", (* p).name);
    printf("%s\n",  p->name);
    return 0;
}
复制代码

结构体嵌套

一个结构体当中可以包含其他类型的结构体,当中自身当中不能包含相同类型的结构体,但是可以包含执行自身的指针

使用示例

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

struct gender{
    char * ch;
};

struct Student
{
    char * name;
    struct Student  * s;
    struct gender gen;
};

int main()
{
    struct gender gen = {"男"};
    struct Student stu = {"泱澈",NULL};
    struct Student student = {
        "泱澈",
        &stu,
        gen
    };

    printf("%s\n", student.name);
    printf("%s\n", (student.s)->name);
    printf("%s\n", student.gen.ch);
    return 0;
}
复制代码

结构体变量在作为参数传递的时候使用的是值传递

typedef struct 与 struct 的区别

typedef 关键字可以将一种数据类型添加一种别名,例如 typedef int Int;此时Int 等价于 int。在stuck中,我们定义的别名可以直接用于定义变量,等价于 struct 类型名。

使用示例

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

struct gender{
    char * ch;
};

typedef struct Student
{
    char * name;
    struct Student  * s;
    struct gender gen;
} Stu;

int main()
{
    struct gender gen = {"男"};
    struct Student stu = {"泱澈",NULL};
    struct Student student = {
        "泱澈",
        &stu,
        gen
    };

    //使用新定义的类型名 定义指针变量 等价于 struct Student
    Stu * s = &student;

    printf("%s\n", (*s).name);
    printf("%s\n", ((*s).s)->name);
    printf("%s\n", (*s).gen.ch);
    return 0;
}
复制代码

enum 枚举

什么是枚举

枚举就是将我们数据可能存在的结果有限个的罗列出来。比如一个人的性别不是男就是女。不会出现其他的值。这个时候我们就可以使用枚举来代表

语法示例

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


enum Gender{
    MAN = 1, //不指定值则从 0开始
    WOMAN = 2 //不指定值则从上一个定义的值开始递增,为 2
};

int main()
{
    //定义枚举变量
    enum Gender g;
    //枚举变量只可能存在一种值
    g = WOMAN;
    printf("%d\n",g);
    return 0;
}
复制代码

union 共用体

什么是共用体

共用体内部可以定义N个变量,但是这个N个变量之间会相互影响。共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员

语法示例

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


union Data{
    int a;
    char b;
    short c;
};

int main()
{
    union Data d ;
    d.a = 46;
    printf("%d\n",d.a);
    printf("%c\n",d.b);
    printf("%d\n",d.c);
    printf("-----\n");

    d.b = 'a';
    printf("%d\n",d.a);
    printf("%c\n",d.b);
    printf("%d\n",d.c);
    printf("-----\n");

    d.c = 47;
    printf("%d\n",d.a);
    printf("%c\n",d.b);
    printf("%d\n",d.c);
    return 0;
}
/*
    运行结果:
    46
    .
    46
    -----
    97
    a
    97
    -----
    47
    /
    47
*/
  • 发表于 2020-12-15 10:29
  • 阅读 ( 470 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1131 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. Pack 1131 文章
  3. 小柒 1046 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章