C结构体的认识以及运用

Posted dmfdz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C结构体的认识以及运用相关的知识,希望对你有一定的参考价值。

一直以来都没有好好的研究过,最近在看一个菜单的框架,里面用到了指针和结构体。指针本来就不是很懂了,加上不熟悉结构体,就打算静下心来好好的学习下。

什么是结构体

结构体其实就是一种数据类型,不同的是它可以容纳好多不同的数据值;一旦结构体类型被声明并且其数据成员被标识,即可创建该类型的多个变量(就像是JAVA等一些面对对象语言可以为同一个类创建多个对象一样)。

结构体的用法其实和类的运用方法很相似,我们通过下面的一张表格来看下

  结构体
关键字 struct class
函数数据成员 可以包含,一般我看到的都是函数指针 可以包含
声明 不包括public 或 private 的访问修饰符 包含
成员默认访问类型 public private

下面我就以一段代码来解释下(来源:傻孩子菜单框架  侵删)

//结构体类型声明
struct MenuItem     
{  
    char MenuCount; //结构体数组的元素个数 
    char *DisplayString;  //当前LCD显示的信息 
    void (*Subs)();  //执行的函数的指针. 
    struct MenuItem *Childrenms;  //指向子节点的指针 
    struct MenuItem *Parentms;  //指向父节点的指针 
}; 

上面声明了一个结构体,里面包含了一个char类型的数据,一个指向char类型的指针,一个函数指针和两个指向结构体的指针;
这里需要注意的是:上述结构体的声明是不会创建任何结构体的实例,它的作用只是告诉我们这个结构体长这样,还没有生出来(创建)
下面我们来创建下结构体的实例(定义)

//结构体定义 
struct MenuItem m0_main[4]; 
struct MenuItem m1_file[5]; 
struct MenuItem m1_edit[4]; 
struct MenuItem m1_view[2]; 
struct MenuItem m2_font[3]; 
struct MenuItem m1_help[3];

上诉的结构体定义之后,就会创建结构体的实例,上述创建了6个实例
结构体被定义后是没有初值的,需要我们对其进行初始化操作:

//结构体初始化
struct MenuItem m0_main[4]= 
{ 
    {4,"file",Nop,m1_file,Null}, 
    {4,"edit",Nop,m1_edit,Null}, 
    {4,"view",Nop,m1_view,Null}, 
    {4,"help",Nop,m1_help,Null}, 
};

struct MenuItem m1_file[5]= 
{ 
    {5,"open",DoSomething,Null,m0_main}, 
    {5,"save",DoSomething,Null,m0_main}, 
    {5,"save as",DoSomething,Null,m0_main}, 
    {5,"print",DoSomething,Null,m0_main}, 
    {5,"exit",GameOver,Null,m0_main}, 
};

struct MenuItem m1_edit[4]= 
{ 
    {4,"undo",DoSomething,Null,m0_main}, 
    {4,"redo",DoSomething,Null,m0_main}, 
    {4,"copy",DoSomething,Null,m0_main}, 
    {4,"paste",DoSomething,Null,m0_main}, 
};

struct MenuItem m1_view[2]= 
{ 
    {2,"font",Nop,m2_font,m0_main}, 
    {2,"color",DoSomething,Null,m0_main}, 
};

struct MenuItem m2_font[3]= 
{ 
    {3,"songti",DoSomething,Null,m1_view}, 
    {3,"heiti",DoSomething,Null,m1_view}, 
    {3,"youyuan",DoSomething,Null,m1_view}, 
};

struct MenuItem m1_help[3]= 
{ 
    {3,"index",DoSomething,Null,m0_main}, 
    {3,"online",DoSomething,Null,m0_main}, 
    {3,"about",DoSomething,Null,m0_main}, 
};

这里我们以第一个m0_main[4]来说明m0_main[4]是一个数组,之前我们已经对其定义为结构体,那么这个数组的每个元素都是一个MenuItem结构体,所以第一个分括号里面的4个分括号就是4个数组的元素,我们还要对每个元素(结构体)初始化,5个分括号里的5个数据就一一对应我们声明的结构体的5个成员

(注:初始化操作中不能只对想要的成员初始化,如只对第1,3,5个成员,{4,Nop,Null},这样是非法的,实际这个只是对第1,2,3初始化,4 5没有初始化)

这里我们还可以直接在函数里用"."来操作赋值,如

m0_main[0].MenuCount = 4

这里就是对m0_main[4]这个数组的第一个元素(结构体)的第一个成员MenuCount赋值为4;

还有其他赋值方法就不在这里一一介绍了

 

以上都是个人理解,欢迎各个大佬指出错误之处

以上是关于C结构体的认识以及运用的主要内容,如果未能解决你的问题,请参考以下文章

C枚举,以及枚举和结构体的不同

C语言基础学习笔记七初始结构体(详细讲解+代码举例+图解)

如何运用领域驱动设计 - 值对象

结构体——从零到1,认识并使用结构体

结构体——从零到1,认识并使用结构体

结构体——从零到1,认识并使用结构体