打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
15W4K58S4 实验5:强制类型转换与指针的运用

实验5 强制类型转换与指针的运用

电路连接图如实验1。


//定义一个无符号长整型,占4个字节

unsignedlong ulong_a;

 

//定义1个无符号字符型,每个占1个字节

unsignedchar uchar_a;

 

//定义一个浮点型,占4个字节

floatfloat_f;

 

//定义指向不明确类型的数据指针

void*p; 

 

//定义一个无符号字符型数组,每个元素占1字节,共4个字节

unsignedchar uchar_array[]={0x11,0x22,0x33,0x44};

 

//定义结构类型,每个结构成员占2字节

 struct stru

  {

  int a;

  int b;

 };

 struct stru *pstru;  //定义指向这种结构类型数据的指针

  

 //强制类型数据转换

 printf("\n\n******************长整型转字符型******************\n");

 ulong_a=0x12345678;   //无符号长整型占用4个字节

 uchar_a=((unsigned char *)&ulong_a)[2];          

&ulong_a:使用取地址运算符& 对无符号长整型ulong_a做取地址操作

(unsignedchar *)&ulong_a将这个指针强制转换为无符号字符型指针

((unsignedchar *)&ulong_a)[2];      [2]表示在这个指针的基础上+2,也就是说此时的指针是无符号字符型指针,它指向 0+2内存位置,即0x56

 0    1     2     3

0x12 0x34  0x56  0x78


 printf("uchar_a<-----ulong_a=0x12345678  uchar_a=0X%b02X\n",uchar_a);

%b02X: b是宽度标识符表示输出1个字节,0表示不足补零,2表示输出占2

输出结果为:

uchar_a<----- ulong_a=0x12345678   uchar_a=0X56

  

  printf("\n\n******************数组转长整型******************\n");

  ulong_a=*((unsigned long *)uchar_array);

uchar_array 是一个无符号字符型数组,它的名字就代表数组的首地址即指向数组首位的指针

(unsigned long *)uchar_array  对这个指针进行强制类型转换,转换为指向无符号长整型的指针

*((unsignedlong *)uchar_array) 转换完成后,通过*运算符对这个指针进行引用,并将值赋给变量ulong_a

 

  printf("ulong_a<-----uchar_array=0x01 0x22 0x330x44  ulong_a=0X%08lX\n",ulong_a);

%08lX lX表示4字节十六进制输出,08表示输出占用8个字符,不足的前面补0

 

输出结果为:

ulong_a<-----uchar_array=0x01 0x22 0x33 0x44 ulong_a=0X01223344

 

  printf("\n\n******************数组转结构体******************\n");

  pstru=(struct stru *)uchar_array;

  uchar_array  是一个无符号字符数组的首地址(指针)

  (struct stru *) 将这个指针强制转换为 struct stru 结构的指针

 

  printf("struct stru 结构<-----uchar_array=0x01 0x22 0x330x44\n");

  printf("pstru->a=0X%04X\n",pstru->a); 取出结构体的一个整型元素并以十六进制显示

  printf("pstru->b=0X%04X\n",pstru->b); 取出结构体的另一个整型元素并以十六进制显示

 

输出结果为:

struct stru 结构<-----uchar_array=0x01 0x22 0x33 0x44

pstru->a=0X0122

pstru->b=0X3344

 

  printf("\n\n******************数组转浮点型******************\n");

  uchar_array[0]=0x11;

  float_f=*((float *)uchar_array);  

uchar_arry是无符号数组指针

(float *)uchar_array  将这个无符号数组指针强制转换为浮点型指针

*((float *)uchar_array)  通过*操作符对指针进行引用读取其指向的值

 

  printf("float_f<-----uchar_array=0x11 0x22 0x330x44\n");

  printf("float_f=%e\n",float_f);

输出结果为:

float_f<-----uchar_array=0x11 0x22 0x33 0x44

float_f=1.279534e-28

 

重新对无符号字符型数组赋值

  uchar_array[0]=0x3F;

  uchar_array[1]=0x9E;

  uchar_array[2]=0x06;

  uchar_array[3]=0x10;

 

  float_f=*((float *)uchar_array);  将指针转换并引用

 

  printf("float_f<-----uchar_array=0x3F 0x9E 0x060x10\n");

  printf("float_f=%f\n",float_f);

输出结果为:

float_f<-----uchar_array=0x3F 0x9E 0x06 0x10

float_f=1.234560

  

 

  printf("\n\n*****************数组转字符型******************\n");

  p=uchar_array;  //将空类型指针指向数组

  uchar_a=((unsigned char *)p)[0];  //将空类型指针强制转换为无符号字符型指针,+0并引用

  printf("uchar_a<-----uchar_array=0x3F 0x9E 0x060x10   uchar_a=%b02X\n",uchar_a);

输出结果:

uchar_a<-----uchar_array=0x3F 0x9E 0x06 0x10  uchar_a=3F

 

  printf("\n\n*****************浮点转字符型******************\n");

  uchar_a=((unsigned char *)&float_f)[0];

  &float_f  &取地址符,取得浮点数指针

  (unsigned char *)&float_f  将这个指针强制转换为无符号字符型指针

  ((unsigned char *)&float_f)[0] 对这个指针+0,并引用

  printf("uchar_a<-----float_f=0x3F 0x9E 0x060x10   uchar_a=%b02X\n",uchar_a);

  输出结果:

uchar_a<-----float_f=0x3F 0x9E 0x06 0x10   uchar_a=3F

 

uchar_a=((unsigned char *)&float_f)[1]; 

  取出浮点数指针,强制转换后,对这个指针+1,并引用

  printf("uchar_a<-----float_f=0x3F 0x9E 0x060x10   uchar_a=%b02X\n",uchar_a);

  输出结果:

uchar_a<-----float_f=0x3F 0x9E 0x06 0x10   uchar_a=9E

实验效果:

 

源码下载地址:https://pan.baidu.com/s/1kJ_vO-2rcReTUdEXNx1_rg  

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
数组元素型指针和数组变量
JavaScript的“强类型数组”简介
C语言数组名作函数参数
C++动态数组
为什么指针被誉为 C 语言灵魂?
C语言学习——指针精华(1)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服