int *point1;float a;point1 = &a; //将float型变量的地址放到指向整型变量的指针变量中,错误。
众所周知,C语言中不同类型的数据在内存中所占用的字节是不相同的。“基类型”会影响指针的移动和指针的运算(加、减)。 例如:point1+1(“使指针移动一个位置”或“使指针值加1”),其所代表的实际地址是point1+1*4,4是一个int类型所占的字节数。
下面是两个与指针变量相关的运算符:
〔1〕&:取地址运算符。
〔2〕*:指针运算符(或称“间接访问运算符”),取其指向的内容。
例如,&a为变量a的地址,*p为指针变量p所指向的存储单元的内容(即p所指向的变量的值)。
借助共用体把16进制值0x70A43F9D写入浮点数a的存储区。
float a,b;unsigned int hexValue = 0x70A43F9D; // 使用联合将uint32_t转换为floatunion { unsigned int i; float f; } converter;converter.i = hexValue;a = converter.f; 0x70A43F9D是浮点数1.23高低字调换后的值,以表示来自设备的不兼容的值。
*((unsigned short*)&b) = *((unsigned short*)&a+1);*((unsigned short*)&b+1) = *((unsigned short*)&a);
说明:先使用 &a 获得变量的地址(如为0x00A00001,起的4个字节,因为x86为小端存取,所以a的低字值0x3F9D存储在变量起始地址的低地址0x00A00001~0x00A00002,高字值0x70A4存储在0x00A00003~0x00A00004)。 因为a为浮点数,所以存储单元指针变量基类型必为浮点型(长度4个字节),要想获得a的高字值的地址,需要先把&a使用 unsigned short* 强制转换为基类型为短整型(长度2个字节)的指针,然后使用(unsigned short*)&a+1 移动指针到下一个位置(指针移动2个字节,到0x00A00003)。然后使用 * 获得短整型的指针中的值,赋值给b的低字变量。然后再把a的低字值赋值给b的高字变量中,完成a的高低字的交换。
〔正文结束〕
---
关注公众号回复“加群”按规则加入『WINCC脚本』技术交流群。关注后在公众号菜单项可查看更多内容。 如果你有与本文相关问题可以后台发消息,欢迎点赞、分享、关注。 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!