单片机C51,C语言的一个指针问题

有这么一段单片机C语言程序:
/* T2中断服务函数,LED动态扫描、蜂鸣器控制 */
void InterruptTimer2() interrupt 5
{
static uint8 i = 0; //LED位选索引

TF2 = 0; //清零T2中断标志
//全部LED动态扫描显示
if (ENLED == 0) //LED使能时才进行动态扫描
{
P0 = 0xFF; //关闭所有段选位,显示消隐
P1 = (P1 & 0xF0) | i; //位选索引值赋值到P1口低4位
P0 = *((uint8 data*)&ledBuff+i); //缓冲区中索引位置的数据送到P0口
if (i < (sizeof(ledBuff)-1)) //索引递增循环,遍历整个缓冲区
i++;
else
i = 0;
}
//由蜂鸣器状态位控制蜂鸣器
if (staBuzzer == 1)
BUZZER = ~BUZZER; //蜂鸣器鸣叫
else
BUZZER = 1; //蜂鸣器静音
}

看到里面的 P0 = *((uint8 data*)&ledBuff+i); 这句不是很懂,,,,哪位大侠帮忙分析下啊?

P0 = *((uint8 data*)&ledBuff+i);
ledBuff是缓冲区的起始位置,它的类型你可以从函数外面看到,因为它是一个全局变量。
&ledBuff是取ledBuff的地址,
(uint8 data*)&ledBuff是把取得的地址强制转换为uint8 data类型的指针。
((uint8 data*)&ledBuff+i是将这个指针位移,偏移量是i
*((uint8 data*)&ledBuff+i)最后加*号是将便宜后的地址中的值取出来,最终赋值给了P0.
这里P0是一个端口。追问

uint8 data* 和 uint8 *data有什么区别啊?

追答

我不是很了解单片机编程,我猜uint8 data是一种数据类型,
uint8 data*是指向这种数据类型的指针。

uint8 *data我不知道是什么。程序里有这样的写法吗?

追问

程序中有这样的数据类型定义: typedef unsigned char uint8;

如果要看完整的程序加Q:289441397

追答

哦?那么我的回答好像不正确。
程序中,data是怎么定义的?

追问

我刚查了:
data:是指将要定义的变量,是用存储在单片机最内部的128字节RAM;
idata:是指将要定义的变量,存储在单片机内部的256字节RAM,idata包含data;
xdata:是指将要定义的变量,存储在单片机外部的RAM空间。

虽然你的答案不是很满意,但为你诚恳的态度赞一个,最佳答案就你了!

我刚查了:
data:是指将要定义的变量,是用存储在单片机最内部的128字节RAM;
idata:是指将要定义的变量,存储在单片机内部的256字节RAM,idata包含data;
xdata:是指将要定义的变量,存储在单片机外部的RAM空间。

虽然你的答案不是很满意,但为你诚恳的态度赞一个,最佳答案就你了!

追答

明白了,这里的data相当于一个修饰符,它用来说明所定义的变量存放的位置。
所以,uint8 data*就是一个指针,类型是uint8,指针的存放位置是单片机最内部的128字节RAM
。我之前的回答,仍然是对的,这里做一下补充。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-03-25
&ledBuff是缓冲区起始地址,

i是偏移量,
uint8 data*强制转换成字节型数据指针,
*((uint8 data*)&ledBuff+i)是缓冲区中的数据,

综上就是把缓冲区ledBuff中的数据从第一个开始读,每次中断读一个字节,直到读完整个缓冲区,之后再从第一个数据开始读,如此循环。追问

uint8 data* 和 uint8 *data有什么区别啊?