C51指针转换

指针转换的时候,出了问题,愿意是想传一个8位的值,通过函数修改后再传回来。函数的参数是16位的。结果却是8位的值取了16位的高字节。编译器使用的Keil。于是写了一个例子(large mode, small mode同样):


#include <stdio.h>


typedef unsigned char INT8U;
typedef unsigned int INT16U;


INT8U fun(INT16U *p)
{


*p = 0×4321;


return *p;


}
void main()
{
INT8U a = 0;
INT8U b = 0;


b = fun((INT16U*)&a);


TI = 1;
printf(“a=0x%x \r\n”, (INT16U)a);  // what’s this?
printf(“b=0x%x \r\n”, (INT16U)b); // and this?


}


结果是什么?
a = 0×43
b = 0×21
======================
原因是什么呢?
在调试的时候,从汇编语句和memory窗口来看,原来是16位指针和8位指针地址位置不一样引起来的。先看图:
1、进入函数时


2、准备返回


3、调用完函数后,a为0×43, b= 0×21.
b通过寄存器传递。


=========
另外一个例子:
INT8U fun(INT16U *p)
{
INT8U *p2;
INT8U c = 0;


p2 = (INT8U*)p;


*p = 0×4321;


c = *p2;  // what’s c


return *p;


}


// c是多少? [0x21]
而如果放到VC6.0上编译运行,结果a = 0×21,  b=0×21.
总结对于C51指针转换来说,如果是普通的转化,和PC, ARM同。如果是函数的指针参数,却要注意。就用正确的指针类型来调用。
 Posted by Ian at 12:52  Tagged with: keil, pointer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值