枚举
枚举是指将变量的值一个一个列举出来,变量的值只限于列举出来的值的范围。枚举可以提高代码的可读性,提高代码的安全性。
语法:
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.注意:
-
申请空间和释放空间成对出现
-
free只是释放了空间 --- 表示这块空间又自由了,但是这块空间上的数据 并不会清零
-
不要多次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;
}