实验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
联系客服