找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1440|回复: 9
收起左侧

C语句疑问 ((BYTE *)&w)[0] 是取W是首地址强制转换指针类型,后面的又跟着[]是

[复制链接]
ID:709761 发表于 2022-12-1 08:22 | 显示全部楼层 |阅读模式
((BYTE *)&w)[0] 是取W是首地址强制转换指针类型,后面的又跟着[]是什么意思?
如果是指针数组的话 取值应该写成 *((BYTE *)&w)[0]
图中代码交换的指针地址还是值
51hei图片_20221201081957.png
回复

使用道具 举报

ID:712493 发表于 2022-12-1 10:09 | 显示全部楼层
关注下这个烧脑的问题
回复

使用道具 举报

ID:752974 发表于 2022-12-1 13:01 | 显示全部楼层
交换的是地址。前面加*号交换的就是值了。
回复

使用道具 举报

ID:627942 发表于 2022-12-1 13:04 | 显示全部楼层
[]中的数代表下标地址,所以((BYTE *)&w)[0]代表取下标0位置的值,前面不用加*号。
回复

使用道具 举报

ID:77589 发表于 2022-12-1 14:01 | 显示全部楼层
BYTE是一个字节,那么就是把一个数的bit0~bit7与bit8~bit15进行交换。
((BYTE *)&w)[0]的运算过程如下:
1、&w取变量w的地址,其实是等到的一个指针;
2、((BYTE *)&w)把得到的指针,强制转换成BYTE *(指向BYTE的指针);
3、((BYTE *)&w)[0]获取指针指向地址中的内容(w的bit0~bit7),注意指针也可以进行下标运算。
其实这样写你就很容易看明白了:
WORD ret;

BYTE * p1 = (BYTE *)&w;
BYTE * p2 = (BYTE *)&ret;
*(p2 + 1) = *p1;
*p2 = *(p1 + 1);

return ret;
回复

使用道具 举报

ID:688692 发表于 2022-12-2 20:46 | 显示全部楼层
这种写法的目的是为了让编译直接编译出MOV direct 的汇编指令,追求代码效率才这样写。其他写法都不会编译出直接MOV指令。我以前用AT89C的时候单片机速度有限,也是这么干的。要不然忙不过来,一个频繁中断的函数。
回复

使用道具 举报

ID:883242 发表于 2022-12-3 00:59 | 显示全部楼层
显然交换的是值,但是在51上面这么用很危险,因为局部变量都是静态分配的,而不是标准c语言那样在堆栈上生成局部变量,调用这个函数的函数应该在这个函数返回后,把返回值保存起来,不然很容易被覆盖。
回复

使用道具 举报

ID:748096 发表于 2022-12-3 06:33 来自手机 | 显示全部楼层
cnos 发表于 2022-12-2 20:46
这种写法的目的是为了让编译直接编译出MOV direct 的汇编指令,追求代码效率才这样写。其他写法都不会编译 ...

直接调用汇编指令不是更好吗
回复

使用道具 举报

ID:170206 发表于 2022-12-4 01:50 | 显示全部楼层
交换的是值,
回复

使用道具 举报

ID:170206 发表于 2022-12-4 01:52 | 显示全部楼层
交换的是值。w的高8位值放在ret的低8位,w的低8位值放在ret的高8位。所以这个函数就是交换w的高低8位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表