一、枚举:
枚举 //一个一个列举出来
"枚举" 是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
作用:
1.为了提高代码可读性
2.提高代码的安全性
语法:
enum 枚举名
{
列举各种值 //枚举元素//枚举常量
};
注意:
列举各种值,之间用逗号隔开,不需要写类型名
eg:
enum fire
{
LITTLE_FIRE,
MIDDILE_FIRE,
LARGE_FIRE,
};
注:
1. 表示 定义了一种 枚举类型
2. 枚举中逐个列举的值,默认是从0开始
如果有给定的值,则后续没有给值的 枚举元素 依次 加1
3. 枚举类型的 本质 实际是一个int类型的数据
4. 枚举类型的变量 与 整型类型的变量通用的
5. 与 宏定义对比
区别:
使用阶段不同:
宏定义 --- 预处理阶段
枚举 --- 编译阶段 要检查语法 运行阶段 参与代码运行
可读性
都提高了可读性
枚举,更能说明有相关性的一些值间关系
练习:
从键盘输入 1~7
打印对应的星期英文
#include<stdio.h>
enum week
{
MONDAY = 1,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
int main(void)
{
int a;
scanf("%d",&a);
switch(a)
{
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 SATURDAY:
printf("SATURDAY\n");
break;
case SUNDAY:
printf("SUNDAY\n");
break;
}
return 0;
}
二、typedef
//type define
//本意 不是定义类型
//给类型起别名
int a; //定义了一个int型变量a
typedef int a; // 此时 a是 int类型的一个别名
eg:给结构体起别名
struct stu
{
};
struct stu s;
typedef struct stu stu_t;
stu_t s1;
#include<stdio.h>
struct student
{
int sno;
char name[100];
};
int main(void)
{
typedef int Inthtx;
Inthtx a;
a = 10;
printf("%d\n",a);
typedef int * int_t;
//int *p = &a;
int_t p;
p = &a;
//int **p = &p;
int_t *q = &p;
int_t **r = &q;
printf("%d\n",***r);
return 0;
}
三、位运算:
c语言特点
可以直接操作二进制位
& 与运算 --- 位运算中 //清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
应用:加密 交换
eg:交换a,b的值
int t;
t = a;
a = b;
b = t;
a = a + b; //
b = a - b; //b = a
a = a - b; //
a = a ^ b;
b = a ^ b;
a = a ^ b;
注意:
1.浮点数不能做位运算
<< 左移
写法:
a<<n //表示将 a这个数据 左移 n位
0000 0001
左移1位 相当于乘 2
0000 0001
0000 0010
注:
最低位 补0
>> 右移
a>>n //表示将 a这个数据 右移 n位
0000 0001
右移1位 相当于除 2
1000
1100
算术右移
//看符号位 看数据类型
如果是有符号类型的数据,右移时,最高位补的是符号位
如果是无符号类型的数据,右移时,最高位补的0
练习:
int a = 0xffffffff;
要求 将偶数位 清0
练习:
int a = 0x00;
要求 奇数位 置1
#include<stdio.h>
int main(void)
{
#if 0
int a = 0xaa;
// printf("a & 0x33 = %#x\n",a & 0x33);
// printf("a | 0x33 = %#x\n",a & 0x33);
// printf("~ a = %#x\n",~a);
unsigned reg = 0xff;
printf("reg & 0x7f = %#x\n",reg & 0x7f);
//7654 3210
//0000 0001
printf("reg = %#x\n",reg & ~(1<<7));
// printf("reg | 0x80 = %#x\n",reg | 0x80);
// printf("reg | 0x80 = %#x\n",reg | 1<<7);
#endif
#if 0
int a = 0xffffffff;
int i;
for(i = 0;i <= 32;i=i+2)
{
a = a & ~(1<<i);
}
printf("a = %#x\n",a);
#endif
int a = 0x00;
int i;
for(i = 1;i < 32;i=i+2)
{
a = a | (1<<i);
}
printf("a = %#x\n",a);
return 0;
}
1.统计int类型数据中1的个数
int a = 121314;
#include<stdio.h>
int main(void)
{
int a = 121314;
printf("a = %#x\n",a);
int i;
int k = 0;
for(i = 0;i < 32;++i)
{
if((a & 1<<i) != 0)
k++;
}
printf("%d\n",k);
return 0;
}
2.实现一个循环左移
#include<stdio.h>
int main(void)
{
int a = 0xf0000001;
int m = 0x80000000;
int i;
int n = 1;//循环次数
for(i=0;i<n;++i)
{
if((m&a) >= m)
{
a = a<<1;
a = a | 1;
}else
{
a = a<<1;
}
}
printf("%#x\n",a);
return 0;
}
----------------------------------------------------------------------------
函数指针 指向函数类型的指针 //基类型为函数类型的指针
指针函数 返回值为指针类型的函数
char *strcpy(char *dest,const char *src);
----------------------------------------------------------------------------
四、堆上的空间:
void *malloc(size_t size);
功能:
在堆上开辟一块空间
参数:
size //表示申请的空间的大小,单位字节
返回值:
成功 返回 申请到内存空间的地址
失败 返回 NULL
//释放函数
void free(void *ptr);
释放之前申请的堆上的空间
参数:
ptr 一定是之前申请到堆上空间的地址
free释放后的空间
1.一般不再使用
2.指向这块空间的指针 --- 是个野指针
3.free之后对应空间上的内容 ---也不要使用
注意:
1. 成对出现
2. free只是释放了空间 --- 表示这块空间 又自由了
但是 这块空间上的数据 并不会清零
3. 不要多次free
练习:
定义整型一维数组 5个元素
数组放在堆上
给5个值,打印输出
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int *p = malloc(sizeof(int[5]));
*p = 100;
*(p+1) = 2;
*(p+2) = 3;
*(p+3) = 4;
*(p+4) = 5;
int i;
for(i = 0;i < 5;++i)
{
printf("*(P+%d) = %d\n",i,*(p+i));
}
free(p);
return 0;
}