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结构体的认识以及运用的主要内容,如果未能解决你的问题,请参考以下文章