枚举
枚举(Enumeration)是一种用户自定义的数据类型,用于定义一组具有离散值的符号常量。枚举使得代码更加可读和易于理解,提高了代码的可读性和可维护性。
//枚举的语法
enum 枚举名称 {
值1,
值2,
值3,
...
};
注意,定义枚举类的关键字是enum,而不是Enum,所有关键字都是小写的!
在定义枚举项时,多个枚举项之间使用逗号分隔,最后一个枚举项后需要给出分号!
枚举成员的类型
枚举的成员默认情况下都是整数类型,通常是int类型。这意味着每个枚举成员都会被赋予一个整数值,并且这些整数值从0开始递增。如果没有显式地指定枚举成员的值,那么第一个成员的值为0,第二个成员的值为1,依此类推。同时,可以显式地为枚举成员指定一个整数值,这个值可以是正整数、负整数或零。
以火锅店中的大小火为例
enum fire
{
LITTLE_FIRE,//默认第一个为0
MIDDILE_FIRE, //1
LARGE_FIRE, //2
};
整体代码可以写成:
#define LITTLE_FIRE 1
#define MIDDILE_FIRE 2
#define LARGE_FIRE 3
main()
{
//
int n;
scanf("%d",&n);
switch(n)
{
//case 1:
case LITTLE_FIRE:
printf("---little fire!---\n");
break;
// case 2:
case MIDDILE_FIRE:
printf("---middile fire!---\n");
break;
//case 3:
case LARGE_FIRE:
printf("---large fire!---\n");
break;
}
}
总结:
1. 枚举是一种枚举类型
2. 枚举中逐个列举的值,默认是从0开始
如果有给定的值,则后续没有给值的 枚举元素 依次 加1
3. 枚举类型的 本质 实际是一个int类型的数据,占4个字节。
4. 枚举类型的变量 与 整型类型的变量通用的 (意思是可以通过手动赋值)
5. 与 宏定义对比
区别:
使用阶段不同 --- 宏定义 --- 预处理阶段
枚举 --- 编译阶段 要检查语法
运行阶段 参与代码运行
举例:输入一个数字,打印出对应的星期几。
enum days
{
MONDAY=1,
TUESDAY,
WEDNESDAY,
THERSDAY,
FRIDAY,
SATURDAY,
SUNDAY,
};
int main()
{
int k;
scanf("%d" ,&k);
switch(k)
{
case MONDAY:
printf("Monday\n");
break;
case TUESDAY:
printf("Tuesday\n");
break;
case WEDNESDAY:
printf("Wedesday\n");
break;
case THERSDAY:
printf("Thersday\n");
break;
case FRIDAY:
printf("Friday\n");
break;
case SATURDAY:
printf("Saturday\n");
break;
case SUNDAY:
printf("Sunday\n");
break;
}
return 0;
}
位运算:
概述:
我们知道,计算机中的数在内存中都是以二进制形式进行存储的 ,而位运算就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高,在程序中尽量使用位运算进行操作,这会大大提高程序的性能。
位运算符号:
运算符的优先级:
在这里我们需要特别注意优先级为1的运算符,因为他们的结合性是从右往左结合的。还有就是同一优先级要先看结合性
举例:
& 与运算 --- 位运算中 //清0
运算规则:
一假则假
eg:
0xaa
1010 1010
0011 0011 &
---------
0010 0010 0x22
| 或运算 //置1
运算规则:
一真则真
1010 1010 // 0xaa
0011 0011 & // 0x33
---------
1011 1011 //0xbb
~ 取反
运算规则:
真假相对
~0xaa
1010 1010 // 0xaa
0101 0101 //0x55
^ 异或
运算规则:
相同为 0
不同为 1
1010 1010 // 0xaa
0011 0011 ^ // 0x33
---------
1001 1001 //0x99
应用:
左移一位实现a*2 右移一位实现a÷ 2
a < < 1 ≡ a ∗ 2
a > > 1 ≡ a / 2
利用运算符实现交换两位整数,在这里说明一下,浮点型不能做位运算,因为其内部有小数,储存方式和int型不一样。
void swap(int &a,int &b){
a ^= b;
b ^= a;
a ^= b;
}
练习:1.统计int类型数据中1的个数
int main(int argc, const char *argv[])
{
int a=121314;
int k=0;
for(int i=0;i<32;i++)
{
if(a&(1<<i))
{
k++;
}
}
printf("%d\n",k);
return 0;
2.实现一个循环左移
int main(int argc, const char *argv[])
{
int a=1;
int k=0;
scanf("%d",&k);
for(int i=0;i<k;i++)
{
if(1&(a>>31))
{
a=(1|a<<1);
}
else
a=a<<1;
}
printf("%#x\n",a);
return 0;
}
malloc
malloc
是C语言标准库函数之一,用于动态内存分配。当你需要程序运行期间根据需要创建数据结构并管理其大小时,可以使用它。malloc函数接收一个整数参数,表示要分配的字节数,返回一个指向新分配内存的指针。如果分配成功,该指针非空;若失败,返回NULL,并可能导致程序出错。
void *malloc(size_t size);
功能:
在堆上开辟一块空间
参数:
size //表示申请的空间的大小,单位字节
返回值:
成功 返回 申请到内存空间的地址
失败 返回 NULL
free
//释放函数
void free(void *ptr);
释放之前申请的堆上的空间
参数:
ptr 一定是之前申请到堆上空间的地址
free释放后的空间
1.一般不再使用
2.指向这块空间的指针 --- 是个野指针
3.free之后对应空间上的内容 ---也不要使用
malloc函数和free函数头文件
#include<stdlib.h> 或者 #include<malloc.h>
注意:
1. 成对出现
2. free只是释放了空间 --- 表示这块空间 又自由了
但是 这块空间上的数据 并不会清零
3. 不要多次free
应用:在堆上手动申请一个数组,输出并打印出来
int main(int argc, const char *argv[])
{
int i=0;
int *p=malloc(sizeof(int));//malloc (sizeof(int)*5);
*p=25;
int q[5];
q[0] =*p;
for(i=0;i<5;i++)
{
scanf("%d ",&q[i]);
}
for(i=0;i<5;i++)
{
printf("%d",q[i]);
}
return 0;
}