一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3532|回复: 8

[51单片机] C51程序请教

[复制链接]
发表于 2012-3-28 16:49 | 显示全部楼层 |阅读模式
请看以下程序:
(仿真环境是KEIL ucVision 2 / 89C52)

main()
{
  unsigned char a[]={7,8,9};
  unsigned char count = 0, *p;
  p = a;
  while(*p)
  {
    count++;
    p++;
  }
  while(1);
}

本意是while循环做3次后,p指向数组尾,也就是0x00,然后循环结束,count最后的值是3。
可是debug的时候发现做了3次循环后while循环不会结束,因为p++后*p不是0x00。
请问这种现象正常吗?可以设置编译器能达到我预期的效果吗?
发表于 2012-3-28 16:54 | 显示全部楼层
本意是while循环做3次后,p指向数组尾,也就是0x00
这里为什么是0x00?
按我的理解,这里应该是a数组9后面一个地址。
回复

使用道具 举报

 楼主| 发表于 2012-3-28 17:28 | 显示全部楼层
回复 2# jckimi


    对,是9后面的一个地址。
    但我在网上搜集资料时候,发现教程对C51的数组里面有这样的一段描述。

====================================================
dasd.jpg
====================================================


    我用标准C语言的编译器编译的时候,程序也能达到我预想的效果。
回复

使用道具 举报

发表于 2012-3-28 17:49 | 显示全部楼层
回复 3# chjj0


   编译器不一样吧,不是很明白。。。
回复

使用道具 举报

 楼主| 发表于 2012-3-28 18:30 | 显示全部楼层
回复 4# jckimi


    还是谢谢您的热心解答。
回复

使用道具 举报

 楼主| 发表于 2012-3-28 18:47 | 显示全部楼层
回复 4# jckimi


    其实这个问题可以用 string.h 里面的strlen(char * src)函数解决的,但本来想着引入这样一个库,程序变得很大,所以就没用。
    然后刚才做了个实验,用了 strlen 函数后,程序大了40字节,在可接受范围里,所有这个问题就用这种方法解决了。
    也就是改成:
    for(i=0; i<strlen(a); i++)
    {
       ... ...
    }
回复

使用道具 举报

发表于 2012-3-28 19:02 | 显示全部楼层
用指针做循环判断会有不可预料的结果,坏习惯啊。
a[n]
用n++多好
回复

使用道具 举报

发表于 2012-3-28 20:13 | 显示全部楼层
回复 7# 狗狗百里游

学习了!
回复

使用道具 举报

 楼主| 发表于 2012-3-28 20:39 | 显示全部楼层
回复 7# 狗狗百里游


    这个应该不是指针的问题,只是数组问题。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-4 20:17 , Processed in 0.032137 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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