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;
}
相关推荐
我要吐泡泡了哦8 分钟前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1238 分钟前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
贾saisai2 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫2 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
烟雨666_java2 小时前
JDBC笔记
笔记
2401_858286112 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
GEEKVIP2 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
铁松溜达py2 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy2 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript