C之 enum、sizeof、typedef(十一)
在 C 语言中经常会见到 enum、sizeof、typedef,那么我们今天就来讲解下它们三个。
首先 enum 是 C 语言中的一种自定义类型,它是一种枚举类型。enum 值是可以根据需要自定义的整型值,第一个定义的 enum 值默认为 0。默认情况下的 enum 值是在前一个定义值的基础上加 1,enum 类型的变量只能取定义时的离散值。enum 中定义的值是 C 语言中真正意义上的常量,在一般工程中 enum 多用于定义×××常量。
下来我们就来写个示例代码分析下,代码如下:
#include<stdio.h>enum{ARRAY_SIZE=5};voidInitArray(intarray[]){inti=0;for(i=0;i<ARRAY_SIZE;i++){array[i]=i+1;}}voidPrintArray(intarray[]){inti=0;for(i=0;i<ARRAY_SIZE;i++){printf("%d\n",array[i]);}}intmain(){intarray[ARRAY_SIZE]={0};InitArray(array);PrintArray(array);return0;}
我们来分析下这个代码,它利用 enum 定义了常量 ARRAY_SIZE,然后创建数组并打印。我们来看下编译结果是否如我们所愿呢?打印如下:
那么我们看到打印确实如我们所想。
接下来我们来讲讲 sizeof 关键字,它是编译器的内置指示符,用于计算类型或变量所占内存打小。那么它所计算的值在编译期就已经确定,也就是说在运行期是没用的。sizeof 于类型时:sizeof(type);用于变量时:sizeof(var) 或 sizeof var。sizeof 是 C语言的内置关键字而不是函数,在编译过程中所有的 sizeof 将被具体的数值所替换,程序的执行过程与 sizeof 没用任何关系。我们来看看 下面这个示例代码会输出什么?
#include<stdio.h>intf(){printf("helloworld\n");return0;}intmain(){intvar=0;intsize=sizeof(var++);printf("var=%d,size=%d\n",var,size);size=sizeof(f());printf("size=%d\n",size);return0;}
我们先来分析下这个代码,在程序的第14行我们做了 var++,理论上第16行打印出来的结果会是 1 和 4。在程序的第18行看似调用了 f() 函数,那么照我们的分析,将会在第20行打印出 4,但是在前面硬打印出 hello world 这句话。下来我们来看看是否如我们所分析的那样呢?
那么这是怎么回事呢?跟我们分析的不一样,var 不等于 1,并且也没有打印出 hello world 那句。我们来仔细想想上面讲的 sizeof 的相关知识,它是在程序的编译期有效的,也就是说程序运行之后并没有去执行 var++,所以 var 仍然等于 0。sizeof 是关键字而不是函数,所以在程序的第18行并不是去调用 f() 函数,自然也就不会去执行函数里的打印语句。因为函数的返回值是 int 型,所以打印的值为 4。
最后我们再来讲讲 typedef 关键字。我们通常以为 typedef 是定义一种新的类型,其实不是的。typedef 用于给一个已经存在的数据类型重命名,其本质上是不能产生新的类型的。注意:它命名的类型可以在 typedef 语句之后,但是不能被 unsigned 和 signed 所修饰。
我们以示例代码来分析下,代码如下:
#include<stdio.h>typedefintInt32;struct_tag_point{intx;inty;};typedefstruct_tag_pointPoint;typedefstruct{intlength;intarray[];}SoftArray;typedefstruct_tag_list_nodeListNode;struct_tag_list_node{ListNode*next;};intmain(){Int32i=-100;unsignedInt32ii=0;Pointp;SoftArray*sa=NULL;ListNode*node=NULL;return0;}
我们来分析这个代码,我们在第19行显然是先重命名后定义的,这种在 C 语言中是合法的。第28行用 unsigned 修饰重命名的类型,这显然是错误的,因此会在28行报错。第29行相当于 struct _tag_point p;第31行相当于 struct _tag_list_node* node;我们来看看编译结果
那么我们注释掉第28行之后,编译就通过了。那么我们今天讲解了 enum、sizeof、typedef ,总结如下:1、enum 用于定义离散值类型,并且它定义的值是真正意义上的常量;2、sizeof 是编译器的内置指示符,不参与程序的执行过程;3、typedef 用于给类型重命名,并且重命名的类型可以在 typedef 语句之后定义。后面我们会继续对 C 语言的学习。
欢迎大家一起来学习 C 语言,可以加我QQ:243343083。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。