鱼C论坛

 找回密码
 立即注册
查看: 3273|回复: 3

写C程序时遇到用指针访问数组的问题

[复制链接]
发表于 2023-2-3 01:02:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码目的是实现输入一个数,把它的每个数位标记到数组里,想问问大家代码有什么问题呀(用在51单片机上的,不知道是不是这段代码出了问题)麻烦了!
  1. int Pow(int a, int b)
  2. {
  3.         int c = a;
  4.        
  5.         if(b==0)
  6.         {
  7.                 a = 1;
  8.         }
  9.         while(b)
  10.         {
  11.                 a = a * c;
  12.                 b--;
  13.         }

  14.         return a;
  15. }

  16. int* counter(unsigned long int count)
  17. {
  18.         unsigned long int a;//a从0开始+1直到==count,从而计算count每一位上的数字
  19.         int number[8], b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组
  20.        
  21.         while(dight+1)
  22.         {
  23.                 for(a=Pow(10,dight+1),b=1;a=a-Pow(10,dight),b++;a>=0)
  24.                 {
  25.                         if(a < count)
  26.                         {
  27.                                 count -= a;
  28.                                 number[dight] = (10 - b);
  29.                                 break;
  30.                         }
  31.                 }
  32.                 dight--;
  33.         }
  34.        
  35.         return number;
  36. }

  37. void main()
  38. {       
  39.         bit flag = 1;
  40.         int checker, timer[8], num;//timer储存counter中的数组,num临时计数
  41.         int *pa = counter(20);//pa储存数组地址
  42.         for(num=0;num++,pa+=4;num<=7)
  43.         {
  44.                 timer[num] = *pa;
  45.        
  46.         }
  47.        
  48.         for(num=0;num++;num<=7)
  49.         {
  50.                 if(timer[num] == 0 && flag == 1)
  51.                 {
  52.                         checker = num;
  53.                         flag = 0;
  54.                 }
  55.                 if(timer[num] != 0 && flag == 0)
  56.                 {
  57.                         flag = 1;
  58.                 }
  59.         }
  60. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-3 01:24:06 | 显示全部楼层
本帖最后由 桃花飞舞 于 2023-2-3 01:31 编辑

你的代码不行吧!
为什么for循环这么写


  1. for(num=0;num++,pa+=4;num<=7)  //这里有pa++不行么?   而且for循环这么写不对吧  改为 for(num=0;num<=7;num++,pa++;)
  2. for(num=0;num++;num<=7)          //for循环这么写不对  改为for(num=0;num<=7;num++)   
  3. int* counter(unsigned long int count)  函数里
  4. int number[8], b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组   
  5. 上句这句改为
  6. int *number = malloc(8*sizeof(int));
  7. int b = 0,dight = 7;
  8. return number; //这样返回局部数组的地址是不正确的 具体可以把函数int* counter(unsigned long int count) 做成int* counter(int * number,int n ,unsigned long int count) ,
  9. 这样就可以返回 number,你这里的用法还不太会。
  10. 或者用上面malloc的方法来写
复制代码

细节多多少少还有问题,慢慢改吧,你的程序没有给出输入输出样例,我也不好给你改错



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-3 07:51:06 | 显示全部楼层
  1. int Pow(int a, int b)
  2. {
  3.     if(b==0)
  4.     {
  5.         return 1;
  6.     }
  7.     b-=1;
  8.     int c = a;
  9.     while(b)
  10.     {
  11.         a = a * c;
  12.         b--;
  13.     }

  14.     return a;
  15. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-3 11:32:57 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-2-3 11:43 编辑

你要先把楼上兄弟们说的错误改正
我说点逻辑上的,我没看懂的的想法。。。。。。。
  1. int* counter(unsigned long int count)
  2. {
  3.         unsigned long int a;//a从0开始+1直到==count,从而计算count每一位上的数字
  4.               //这里注释a是从0开始
  5.         int number[8], b, dight = 7;//b作临时计数变量,计算每一位的大小并赋值给数组
  6.       
  7.         while(dight+1)
  8.         {
  9.                 for(a=Pow(10,dight+1),b=1;a=a-Pow(10,dight),b++;a>=0)
  10.                             //这里a是从10^8开始 ,,,第二次循环a= a- 10^6,丢了7啊
  11.                             //假如补上7,第一次a=10^8, 第二次 a= 10^8 - 10^7 = 10, 这不合理,怎么拿到每一位的数字?
  12.                 {
  13.                         if(a < count)
  14.                         {  // 这一段我没看明白 参数count = 20传进来, 当a=10时进入这里
  15.                                 count -= a;   // count = 10
  16.                                 number[dight] = (10 - b);    // 10 -  循环次数(b) ,这是想记录什么??????
  17.                                 break;     //想遍历这里应该是用 continue,要不if只进一次就结束while循环了
  18.                         }
  19.                 }
  20.                 dight--;
  21.         }
  22.       
  23.         return number;
  24. }
复制代码
  1. 还有第45行for(num=0;num++,pa+=4;num<=7)
  2. 这里可能也有问题, C51是8位机,要确认一下你的环境int是不是4个字节 ,要不pa += 4 一下就超了, 没有必要手动,已经定义了pa 是int 型, 直接p++就是下一个int的位置了
复制代码
  1. //一般我们提取各个位上的数字是用求余的方式
  2. int count = 56214;  //待分析数字
  3. int dig;  //存放拿到的一位数字
  4. for( ; count > 0; count /= 10)
  5. {    //从个位开始拿到每一位数字
  6.              dig = count % 10;
  7.              printf("%d\n", dig);
  8. }
  9. // 这一段会输出
  10. // 4
  11. // 1
  12. // 2
  13. // 6
  14. // 5
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 17:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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