博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言基础(下)
阅读量:3899 次
发布时间:2019-05-23

本文共 3846 字,大约阅读时间需要 12 分钟。

结构体类型

什么是结构体

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

结构体指针

指向结构体类型的指针

使用示例

#include 
#include
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 
#include
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 
#include
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 
#include
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 
#include
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*/

以上就是本期的全部内容了,非常感谢你能看到这里,我们下期见!

转载地址:http://otden.baihongyu.com/

你可能感兴趣的文章
【设计模式基础】行为模式 - 1 - 观察者(Observer)
查看>>
【数据库基础】数据库事务 - Transaction
查看>>
【设计模式基础】行为模式 - 3 - 职责链(Chain of responsibility)
查看>>
【Maven】Archetype
查看>>
【Tools.Eclipse】代码自动提示
查看>>
【Java.Web】MVC —— 基于Filter Dispatcher的Model2 —— 示例
查看>>
【Java.JDBC/ORM】纯JDBC系统的开发随想
查看>>
【Unix/Linux】【系统】环境变量
查看>>
【Architecture】CPU-bound(计算密集型) 和I/O bound(I/O密集型)
查看>>
【MacOS】Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew
查看>>
为窗口添加鼠标HOVER和LEAVE事件
查看>>
VC小技巧20个
查看>>
MFC Feature Pack for Visual C++ 2008的BUG之一
查看>>
数据库SQL语言语法总结4---数据更新
查看>>
数据库SQL语言语法总结5---视图
查看>>
数据库SQL语言语法总结6---数据控制
查看>>
数据库SQL语言语法总结1---表操作
查看>>
你对ArrayList了解多少?
查看>>
《从Paxos到ZooKeeper分布式一致性原理与实践》学习知识导图
查看>>
Java基础面试题(一) (2020持续更新)
查看>>