枚举、typedef、位运算、malloc函数(c语言完结(17))

一、枚举:

枚举    //一个一个列举出来  
"枚举" 是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

作用:
    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;
}

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值