目录
枚举:
定义:
enum 枚举名
{
a,
b,
c//列举各种值,用逗号隔开,不需要写类型名
}
含义:
1.表示定义了一种枚举类型
2.枚举中逐个列举的值,默认是从0开始
3枚举类型的本质实际上是一个int 类型的数据
4.枚举类型的变量与整型变量通用
5.与宏定义区别:
使用阶段不同:宏定义在预处理阶段,而枚举在编译阶段接受语法检查且在运行阶段参与代码运行
enum fire
{
SMALLFIRE,//默认从0开始
MIDDLEFIRE,
BIGFIRE,
};
enum fire
{
SMALLFIRE,//从0开始
MIDDLEFIRE=4,//但后面赋值为4是后面则按照4的顺序依次默认赋值5,6......
BIGFIRE,
};
使用枚举输入1~7打印对应的星期:
enum week
{
Monday = 1,
Tuesday,
Wednsday,
Thesday,
Friday,
Stauday,
Sunday,
};
void printWeek(int n)
{
switch(n)
{
case Monday:
printf("Monday\n");
break;
case Tuesday:
printf("Tuesday\n");
break;
case Wednsday:
printf("Wednsday\n");
break;
case Thesday:
printf("Thesday\n");
break;
case Friday:
printf("Friday\n");
break;
case Stauday:
printf("Stauday\n");
break;
case Sunday:
printf("Sunday\n");
break;
}
}
typedef:
作用:给已有的类型起别名,方便解读代码。
#include <stdio.h>
int main()
{
typedef int * intp;
typedef int** intpp;
int a = 10;
intp p = &a;
intpp q = &p;
intpp *k = &q;
printf("%p %p\n",p,&a);
printf("%p %p\n",q,&p);
printf("%p %p\n",k,&q);
}
位运算:
(浮点数不能做位运算)
&与运算:
运算规则:1假则假
作用:清零运算
|或运算:
预算规则:1真则真
作用:置1作用
~取反:
运算规则:真假相对
int a = 0xffffffff;
for(int i = 0; i < 32;i++)
{
if(i%2==0)//实现偶数位置零
a =a& ~(1<<i);
}
printf("%#x",a);
^异或运算:
形同为0,相异为1.
异或实现不用第三方交换两个数。
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
<<左移:
a<<n:表示将a这个数据位左移n位(相当于乘以2的n次方)
左移之后在低位补0
计算数中有几个1
int a = 131415;
int sum = 0;
for(int i = 0; i < 32; i++)
{
if(d&(1<<i))
{
sum = sum + 1;
}
d = d>>1;
}
printf("%d\n",sum);
实现循环左移,移出来的为1则在后面补1,为0则不管,系统自动补0
int n ;
int d = 0xf0000001 ;
int e = 0x80000000;
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
if(d&e)
{
d = d<<1|0x01;
}
else
d = d<<1;
}
printf("%#x",d);
右移>>;
a>>n;表示将a这个数据位右移n位(相当于除以2的n次方)
算数右移:看符号位和数据类型
1.如果是有符号类型数据,右移时最高位补1
2.如果时无符号类型数据,右移时最高位补符号位
函数指针:指向函数类型的指针//基类型为函数类型的指针。
指针函数:返回值为指针的函数。
malloc函数:
函数声明:void *malloc(size_t size)
功能:在堆上开辟一块空间
参数:size表示申请的空间大小(字节单位)
返回值:成功返回申请到的内存空间的地址,失败返回NULL
free函数
函数声明:void free(void *ptr)
释放之前申请到的内存空间
注意:1.free释放后的空间一般不再使用
2.指向这块内存空间的是个野指针
3.free之后的空间内容也不要使用
free和malloc:
①申请空间和释放空间一般成对出现
②free只是释放了空间,表示这块空间又自由了,但是这块内存空间的数据并不会清零
③不能释放两次空间,free(p),free(p),因为释放后的空间有可能是别的地方使用的。
#include <stdio.h>
#include <stdlib.h>
void testMalloc()
{
int age[10];
int* p = malloc(10*sizeof(int));//申请内存空间
if(!p)//判断申请是否成功
{
printf("apply error");
return;
}
for(int i = 0; i < 10; i++)
{
// *(p+i) = i*2;
printf("%d\n",*(p + i));
}
// printf("%d",*p++);//指针加加,从0x000到0x004,偏移了,不在首地址了(若想这样,需定义一个指针保存p的首地址
//,int* delp = p,然后free(delp);因为free要求释放的是内存空间首地址)
free(p);//手动申请必须手动释放,若不释放,即没人管,多了就内存不足,系统卡顿,称为内存泄露
//释放之后就不能在访问这块空间了所以处于安全考虑释放之后应把指针置空的delp = NULL/p = NULL;
}