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

互联时代

结构体类型

什么是结构体

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

相关推荐