【C语言进阶剖析】11、enum,sizeof 和 typedef 分析

本文深入探讨C语言的枚举类型、sizeof关键字及typedef的使用技巧。解析枚举类型的定义与应用,sizeof如何计算类型或变量的内存占用,以及typedef在类型重命名中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 枚举类型的使用方法

  • enum 是 C 语言中的一种自定义类型
  • enum 值是可以根据需要自定义的整数值
  • 默认情况下第一个定义的 enum 值为 0,其他的值是在前一个值的基础上加 1
  • enum 类型的变量只能取定义时的离散值

在这里插入图片描述

枚举类型的特殊意义
enum 中定义的值是 C 语言中真正意义上的常量,在工程中 enum 多用于定义整型常量,其值不能再修改。

下面通过一个例子来说明 enum 的使用

//11-1.c
#include<stdio.h>
enum{						// 无名枚举,用于定义常量
    ARRAY_SIZE = 10			// 定义数组大小
};

enum Color{
    RED = 0x00FF0000,
    GREEN = 0x0000FF00,
    BLUE = 0x000000FF
};

void PrintColor(enum Color c){
    switch(c){
        case RED:
            printf("Color: RED (Ox%08X)\n", c);
            break;
        case GREEN:
            printf("Color: GREAN (0x%08X)\n", c);
            break;
        case BLUE:
            printf("Color: BLUE(0x%08X)\n", c);
            break;
        default:
            printf("Unknow color\n");
            break;
    }
}
void InitArray(int array[]){
    int i = 0;
    for (i = 0; i < ARRAY_SIZE; i++){
        array[i] = i + 1;
    }
}
void PrintArray(int array[]){
    int i = 0;
    for (i = 0; i < ARRAY_SIZE; i++){
        printf("%d\n", array[i]);
    }
}
int main(){
    enum Color c = GREEN;
    int array[ARRAY_SIZE] = {0};
    PrintColor(c);
    InitArray(array);
    PrintArray(array);
    return 0;
}

在这里插入图片描述

2 sizeof 关键字

2.1 sizeof 关键字的用法

sizeof 是编译器的内置指示符,用于计算类型或者变量的所占的内存大小,sizeof 的值在编译器就已经确定了。

语法如下:
在这里插入图片描述

以前使用 sizeof,感觉就像一个函数一样,其实 sizeof 并不是函数,而是编译器的内置指示符,从 sizeof var 的用法也可以看出来,函数不能这么使用

2.2 为 sizeof 正名

  • sizeof 是 C 语言的内置关键字而不是函数
  • 在编译过程中所有的 sizeof 将被具体的数值替换,函数的执行过程与 sizeof 没有任何关系

下面通过一个例子来说明。

//11-2.c
#include<stdio.h>
int f(){
    printf("hello world!");
    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;
}

在这里插入图片描述

1、var 为 int 型的变量,所以大小为 4,为什么打印的 var 的值为 0 呢?在编译期,sizeof(var++) 已经被替换成了 4,var++根本没有执行,所以 var 的值还是 4。
2、f() 返回值为 int,所以 sizeof(f()) 为 4,为什么没有打印出 hello world! 呢, 还是因为 sizeof 是在编译过程将用数值替换,函数的执行过程与 sizeof 没有任何关系,所以 f() 函数不会执行。

3 typedef 的意义

想象一个场景:假设你在面试,考官:你能说说 typedef 的具体意义吗?

下面就来说说 typedef 的意义

  • typedef 用于给一个已经存在的数据类型重命名
  • typedef 本质上不能产生新的类型
  • typedef 重命名的类型可以在 typedef 语句之后定义,且不能被 unsigned 和 signed 修饰

用法:typedef type new_name;
type 是已经有的数据类型,new_name 是该数据类型的别名

//11-3.c
#include<stdio.h>
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{		// ypedef 重命名的类型可以在 typedef 语句之后定义
	ListNode* next;
};
int main(){
	Int32 i = -100;
	//unsigned Int32 ii = 0;	//  typedef 重命名的类型不能被 unsigned 和 signed 修饰
	Point p;
	SoftArray* sa = NULL;
	ListNode* node = NULL;
	return 0;
}

4 小结

1、enum 用于定义离散值类型,enum 定义的值是真正意义上的常量
2、sizeof 是编译器的内置指示符,不参与程序的执行过程
3、typedef 用于给类型重命名,重命名的类型可以在 typedef 语句之后定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值