资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

C之enum、sizeof、typedef(十一)

        在 C 语言中经常会见到 enum、sizeof、typedef,那么我们今天就来讲解下它们三个。

为罗城等地区用户提供了全套网页设计制作服务,及罗城网站建设行业解决方案。主营业务为做网站、成都做网站、罗城网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

        首先 enum 是 C 语言中的一种自定义类型,它是一种枚举类型。enum 值是可以根据需要自定义的整型值,第一个定义的 enum 值默认为 0。默认情况下的 enum 值是在前一个定义值的基础上加 1,enum 类型的变量只能取定义时的离散值。enum 中定义的值是 C 语言中真正意义上的常量,在一般工程中 enum 多用于定义×××常量。

        下来我们就来写个示例代码分析下,代码如下:

#include 

enum
{
    ARRAY_SIZE = 5
};

void InitArray(int array[])
{
    int i = 0;
    
    for(i=0; i

        我们来分析下这个代码,它利用 enum 定义了常量 ARRAY_SIZE,然后创建数组并打印。我们来看下编译结果是否如我们所愿呢?打印如下:

C之 enum、sizeof、typedef(十一)

        那么我们看到打印确实如我们所想。

        接下来我们来讲讲 sizeof 关键字,它是编译器的内置指示符,用于计算类型或变量所占内存打小。那么它所计算的值在编译期就已经确定,也就是说在运行期是没用的。sizeof 于类型时:sizeof(type);用于变量时:sizeof(var) 或 sizeof var。sizeof 是 C语言的内置关键字而不是函数,在编译过程中所有的 sizeof 将被具体的数值所替换,程序的执行过程与 sizeof 没用任何关系。我们来看看 下面这个示例代码会输出什么?

#include 

int f()
{
    printf("hello world\n");
    
    return 0;
}

int main()
{
    int var = 0;
    
    int size = sizeof(var++);
    
    printf("var = %d, size = %d\n", var, size);
    
    size = sizeof(f());
    
    printf("size = %d\n", size);
    
    return 0;
}

        我们先来分析下这个代码,在程序的第14行我们做了 var++,理论上第16行打印出来的结果会是 1 和 4。在程序的第18行看似调用了 f() 函数,那么照我们的分析,将会在第20行打印出 4,但是在前面硬打印出 hello world 这句话。下来我们来看看是否如我们所分析的那样呢?

C之 enum、sizeof、typedef(十一)

        那么这是怎么回事呢?跟我们分析的不一样,var 不等于 1,并且也没有打印出 hello world 那句。我们来仔细想想上面讲的 sizeof 的相关知识,它是在程序的编译期有效的,也就是说程序运行之后并没有去执行 var++,所以 var  仍然等于 0。sizeof 是关键字而不是函数,所以在程序的第18行并不是去调用 f() 函数,自然也就不会去执行函数里的打印语句。因为函数的返回值是 int 型,所以打印的值为 4。

        最后我们再来讲讲 typedef关键字。我们通常以为 typedef是定义一种新的类型,其实不是的。typedef用于给一个已经存在的数据类型重命名,其本质上是不能产生新的类型的。注意:它命名的类型可以在 typedef 语句之后,但是不能被 unsigned 和 signed 所修饰。

        我们以示例代码来分析下,代码如下:

#include 

typedef int Int32;

struct _tag_point
{
    int x;
    int y;
};

typedef struct _tag_point Point;

typedef struct
{
    int length;
    int array[];
} SoftArray; 

typedef struct _tag_list_node ListNode;
struct _tag_list_node
{
    ListNode* next;
};

int main()
{
    Int32 i = -100; 
    unsigned Int32 ii = 0;
    Point p;
    SoftArray* sa = NULL;   
    ListNode* node = NULL;
    
    return 0;
}

        我们来分析这个代码,我们在第19行显然是先重命名后定义的,这种在 C 语言中是合法的。第28行用 unsigned 修饰重命名的类型,这显然是错误的,因此会在28行报错。第29行相当于 struct  _tag_point p;第31行相当于 struct _tag_list_node* node;我们来看看编译结果

C之 enum、sizeof、typedef(十一)

        那么我们注释掉第28行之后,编译就通过了。那么我们今天讲解了 enum、sizeof、typedef ,总结如下:1、enum 用于定义离散值类型,并且它定义的值是真正意义上的常量;2、sizeof 是编译器的内置指示符,不参与程序的执行过程;3、typedef 用于给类型重命名,并且重命名的类型可以在 typedef 语句之后定义。后面我们会继续对 C 语言的学习。

         欢迎大家一起来学习 C 语言,可以加我QQ:243343083。


文章名称:C之enum、sizeof、typedef(十一)
网页地址:http://cdkjz.cn/article/gjhccd.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220