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

枚举

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

语法:

enum 枚举名
{
    列举各种值
};

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

例:

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

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

	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。也可以直接用等号将成员变量赋为需要的值,示例如下:

enum fire
{
	LITTLE_FIRE =1,
	MIDDILE_FIRE=5,
	LARGE_FIRE =8
};

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

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

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

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

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

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

#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用来给数据类型起别名,用于声明新的类型名来代替已有的类型名。可以简化代码,提高代码可读性。

举例:

int a;//定义了一个int型变量a
typedef int a;//此时a是int型变量的别名

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

#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;

代码如下:

#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.实现一个循环左移 

#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.不用中间值交换两数的值:

方法一:
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个值,打印输出 

#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;
}


 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值