C51指针问题请教
我在学习指针过程碰到一个问题,请教大家:
下面程序,单片机上电运行,第一次调用readRom()函数正常,第二次调用读取的数就不对了,也就是说while(1) 里第二个循环就不对了,第一个循环是正确的,第三次以后每次读出数字跟第二次是一样的,如果把指针*p换为全局的,也就是程序最前面定义,就正确了,把*p换成普通变量,也没问题的,请问这是为什么?
.....
.....
[code=C#][/code]
readRom()
{
unsigned char *p,i;
for(i=0;i<8;i++)
{
*p=readbyte(); //读取一个字节
lcd_dis(*p); //显示到LCD
}
}
main()
{
while(1)
{
readRom();
delayms(200); //延时一会
}}
[解决办法]
unsigned char *p,i;
for(i=0;i<8;i++)
{
*p=readbyte(); //读取一个字节
P没有指定空间。。。
程序乱写到别的地方了
[解决办法]
unsigned char *p,i; //这里,定义了指针,但没有赋值
for(i=0;i<8;i++)
{
*p=readbyte(); //读取一个字节 //这里,使用了指针,但依然没有赋值,仅仅是对指针指向的内存进行了数据操作
lcd_dis(*p); //显示到LCD //这里,仍然没有涉及到指针本身的值,仅仅是读取了指针指向的内存的值
这里完全是把指针当一般的Uchar来用了,理论上来说这也没什么,只是多了一个值的传递罢了。唯一的风险就是在其他的程序运行中,恰好影响到了我们未知的P的本身的值或其所指向的内存,从而造成其他影响。但是如果在其他的函数中没有点名提到P或固定位置的RAM的话,编译器是不会让上面的事情发生的。所以我们才会说把其他的函数也贴来看看。
PS:C51的RAM很小的,而且在编译时还会涉及的诸多设置的问题,所以不能提供完整的信息的话,想找问题是很难的
[解决办法]
全局指针变量的话,其本身值是固定的,是不会被其他用途占用的,但仍然有其指向的内存被篡改的可能
[解决办法]
还真是你指针没有分配空间的问题
把指针换成数组就好了
p[1];
[解决办法]
readRom(){unsigned char *p,i; for(i=0;i<8;i++) { *p=readbyte(); //读取一个字节 lcd_dis(*p); //显示到LCD }}
[解决办法]