C语言——枚举、typedef、位运算、堆

枚举

枚举是指将变量的值一个一个列举出来,变量的值只限于列举出来的值的范围。枚举可以提高代码的可读性,提高代码的安全性。

语法:

cpp 复制代码
enum 枚举名
{
    列举各种值
};

列举的值,我们称为枚举元素或枚举常量,在后面的代码中,可以用元素代表一个常量。枚举写完后要以分号结尾。

例:

cpp 复制代码
enum fire
{
	LITTLE_FIRE ,
	MIDDILE_FIRE,
	LARGE_FIRE 
};//表示定义了一种枚举类型。

**注意:**列举各种值时,用逗号隔开,最后一个值可以不加逗号。

cpp 复制代码
	printf ("LITTLE_FIRE = %d\n",LITTLE_FIRE);
	printf("MIDDILE_FIRE = %d\n",MIDDILE_FIRE);
	printf("LARGE_FIRE = %d\n",LARGE_FIRE);

1.枚举中逐个列举的值,默认是从0开始的,后面的成员变量默认加一。此时直接打印成员变量的值,可以分别得到0,1,2。也可以直接用等号将成员变量赋为需要的值,示例如下:

cpp 复制代码
enum fire
{
	LITTLE_FIRE =1,
	MIDDILE_FIRE=5,
	LARGE_FIRE =8
};

成员变量间还是用逗号隔开,此时打印分别得到1,5,8。

2.枚举类型本质上是个int型的数据。枚举类型的变量与int型变量通用。所以打印时用的是%d。

3.枚举与宏定义的区别:

(1)使用阶段不同:宏定义在预处理阶段使用;枚举在编译阶段,编译时要检查语法,在代码运行阶段,要参与代码运行。

(2)在代码可读性方面:都提高了可读性,但枚举更能说明有相关性一些值间关系。

练习:从键盘输入 1~7 ,打印对应的星期英文

cpp 复制代码
#includ <stdio.h>
enum week
{
	Monday = 1,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Satyrday,
	Sunday
};

int main(void)
{
	int n;
	scanf("%d",&n);
	switch(n)
	{
	case Monday:
		printf("Monday\n");break;
	case Tuesday:
		printf("Tuesday\n");break;
	case Wednesday:
		printf("Wednesday\n");break;
	case Thursday:
		printf("Thursday\n");break;
	case Friday:
		printf("Friday\n");break;
	case Satyrday:
		printf("Satyrday\n");break;
	case Sunday:
		printf("Sunday\n");break;
	default:
		printf("input error!\n");break;
	}
	return 0;
}

typedef

typedef用来给数据类型起别名,用于声明新的类型名来代替已有的类型名。可以简化代码,提高代码可读性。

举例:

cpp 复制代码
int a;//定义了一个int型变量a
typedef int a;//此时a是int型变量的别名

简单应用:用多级指针打印a的值

cpp 复制代码
#include <stdio.h>
int main(int argc, const char *argv[])
{
	typedef int * int_t;
	int a = 10;
	int_t p = &a;
	int_t *q = &p;
	int_t **r = &q;
	
	printf("%d\n",***r);	
	return 0;
}

位运算

所谓位运算是指进行二进制位的运算。在系统软件中,用位运算处理二进制位的问题。

C语言中的位运算符:

运算规则:

&:一假则假,常用来清0

|:一真则真,常用来置1

~:真假相对

<<:左移 ,a<<n,表示将a左移n位,相当于a*2^n,在最低位补0

>>:右移,a<<n,表示将a向右移n位,相当于a/2^n,如果为有符号数,则高位添加符号位,没有符号位,则高位添0。

^:相同为0,不同为1,可用于数据加密

练习:

1.统计int类型数据中1的个数

int a = 121314;

代码如下:

cpp 复制代码
#include <stdio.h>
int main (void)
{
	int a =121314;
	int i = 0;
	int k = 0;
	for(i = 0;i < 32;++i)
	{
		if ((a & 1<<i) != 0)
			++k;
	}
	printf("k = %d\n",k);
    return 0;
}

2.实现一个循环左移

cpp 复制代码
#include <stdio.h>
int main (void)
{
//	int a =0xf0000001; 
	int a =0xcd;
	int i = 0;
	for (i = 0;i < 8;++i)
	{
		if (a & 0x80000000)
		{
			a = a<<1;
			a += 1;//a = a|1;
		}
		else 
			a = a<<1;
		printf("%#x\n",a);
	}
    return 0;
}

3.不用中间值交换两数的值:

cpp 复制代码
方法一:
a = a+b;
b = a-b;
a = a-b;

方法二:
a = a^b;
b = a^b;
a = a^b;

堆上空间的使用

堆上的空间需要手动申请手动释放。

1.申请空间

申请堆上空间用到函数:void *malloc(size_t size); 在堆上开辟一块空间 。

参数: size //表示申请的空间的大小,单位字节 。

返回值:

成功 返回 申请到内存空间的地址

失败 返回 NULL

2.释放空间

释放空间需要函数: void free(void *ptr);释放之前申请的堆上的空间

参数: ptr 一定是之前申请到堆上空间的地址

free释放后的空间 :

1.一般不再使用

2.指向这块空间的指针 --- 是个野指针

3.free之后对应空间上的内容 ---也不要使用

3.注意:

  1. 申请空间和释放空间成对出现

  2. free只是释放了空间 --- 表示这块空间又自由了,但是这块空间上的数据 并不会清零

  3. 不要多次free

练习: 定义整型一维数组 5个元素把数组放在堆上,给5个值,打印输出

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{

	int i = 0;
	int	*p = malloc(sizeof(int)*5);
	for (i = 0;i < 5;++i)
	{
		p[i] = i*2;
	}
	for(i = 0;i < 5;++i)
	{
		printf("%d ",p[i]);
	}
	putchar('\n');
	free(p);
	return 0;
}
相关推荐
LabVIEW开发6 分钟前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
benchmark_cc1 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
前进的李工2 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
Zenova EdgeOS2 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是2 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing033 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
正在走向自律4 小时前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付
Fatbobman(东坡肘子)4 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..4 小时前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert4 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang