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

作者: 李冬    时间: 2022-12-1 08:22
标题: C语句疑问 ((BYTE *)&w)[0] 是取W是首地址强制转换指针类型,后面的又跟着[]是
((BYTE *)&w)[0] 是取W是首地址强制转换指针类型,后面的又跟着[]是什么意思?
如果是指针数组的话 取值应该写成 *((BYTE *)&w)[0]
图中代码交换的指针地址还是值

51hei图片_20221201081957.png (5.7 KB, 下载次数: 60)

51hei图片_20221201081957.png

作者: fj51hei    时间: 2022-12-1 10:09
关注下这个烧脑的问题
作者: munuc_w    时间: 2022-12-1 13:01
交换的是地址。前面加*号交换的就是值了。
作者: snso666    时间: 2022-12-1 13:04
[]中的数代表下标地址,所以((BYTE *)&w)[0]代表取下标0位置的值,前面不用加*号。
作者: Longan.Wang    时间: 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;
作者: cnos    时间: 2022-12-2 20:46
这种写法的目的是为了让编译直接编译出MOV direct 的汇编指令,追求代码效率才这样写。其他写法都不会编译出直接MOV指令。我以前用AT89C的时候单片机速度有限,也是这么干的。要不然忙不过来,一个频繁中断的函数。
作者: Hephaestus    时间: 2022-12-3 00:59
显然交换的是值,但是在51上面这么用很危险,因为局部变量都是静态分配的,而不是标准c语言那样在堆栈上生成局部变量,调用这个函数的函数应该在这个函数返回后,把返回值保存起来,不然很容易被覆盖。
作者: 沧兴电子    时间: 2022-12-3 06:33
cnos 发表于 2022-12-2 20:46
这种写法的目的是为了让编译直接编译出MOV direct 的汇编指令,追求代码效率才这样写。其他写法都不会编译 ...

直接调用汇编指令不是更好吗
作者: hmsfeng    时间: 2022-12-4 01:50
交换的是值,
作者: hmsfeng    时间: 2022-12-4 01:52
交换的是值。w的高8位值放在ret的低8位,w的低8位值放在ret的高8位。所以这个函数就是交换w的高低8位




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1