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;
}
相关推荐
厂太_STAB_丝针1 小时前
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
c语言·单片机·嵌入式硬件
charlie1145141913 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
来恩10033 小时前
C# 类与对象详解
开发语言·c#
*TQK*3 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
komo莫莫da3 小时前
寒假刷题Day19
java·开发语言
ElseWhereR4 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法
马船长4 小时前
[BSidesCF 2020]Had a bad day1
学习
*TQK*4 小时前
ZZNUOJ(C/C++)基础练习1031——1040(详解版)
c语言·c++·编程知识点
黄交大彭于晏4 小时前
三端回链增加截图功能
学习
linwq84 小时前
设计模式学习(二)
java·学习·设计模式