微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

后代打印 C 数组

如何解决后代打印 C 数组

我的程序有什么问题,应该按降序打印数组的内容

想要的输出

500
400
300
200
100

我的代码

#include <stdio.h>
int main() {
int numar[]={100,200,300,400,500};
int *pnumar;

pnumar=numar;

for (int contor=5;contor>0;contor--)
{
     pnumar--;
    printf("%d \n",*pnumar ) ;
   
}
}

解决方法

这是因为您正在尝试访问未分配的内存。当你做 pumar=numar 指针 start 指向数组 numar 的起始地址,递减导致循环访问未分配的内存。如果你想以相反的顺序访问数组数据,那么只需用这个替换 for 循环

for (int contor=4;contor>=0;contor--){
printf("%d \n",pnumar[contor] ) ;

}

,

如评论中所述,您的指针指向数组的第一个元素(“100”),而不是最后一个。

在第一次操作时,您将指针递减,使其向后移动,这使得它甚至在您的程序有机会打印出数字之前就已指向数组之外。

指针算术说明您可以使用:

pnumar=numar+4;

... 将其移动到所需位置。稍后,您可能想改用索引运算符 []

,

另一种方法:对数组进行排序以将其放入您想要的顺序。

#include <stdio.h>
#include <stdlib.h>

int order_descending(const void *p1,const void *p2)
  {
  return *(int *)p2 - *(int *)p1;
  }

int main()
  {
  int numar[] = {100,200,300,400,500};
  int *pnumar;
  int nArray_count = (sizeof(numar) / sizeof(numar[0]));

  pnumar = numar;

  qsort(numar,nArray_count,sizeof(numar[0]),order_descending);

  for (int i = 0 ; i < nArray_count ; i++)
    printf("%d \n",*pnumar++);
  }

Run it at OnlineGDB

,

当您将 pnumar 分配给 numar 时,它存储数组中第一个整数的地址。所以在 for 循环的第一次迭代中,当它递减时它退出数组。代替pnumar = numar,执行pnumar = numar + 5,它将转到numar 中最后一个元素之后的地址。那么它应该可以正常运行。

,

您当前的代码具有赋值 pnumar = numar;,它使 pnumar 指向数组的开头。

因为你想反向循环,你会想要这样的东西:

#include <stdio.h>

int main(void) {
    int numar[] = { 100,500 };
    int *pnumar;
    pnumar = &numar[4];
    for (int contor = 5; contor > 0; contor--) {
       printf("%d\n",*pnumar);
       pnumar--;
    }
    return 0;
}

赋值pnumar = &numar[4];使pnumar指向数组的最后元素。

然后,在您的循环中,您可以在打印之后而不是之前减少指针(pnumar--;

(旁注:您的代码最后缺少 return 语句)。

,

正如 Cortez 中士所解释的,您希望指针从数组的末尾而不是开头开始,因此您可以解决这个问题,例如,通过在 for 循环上方添加以下语句:

pnumar += 5;

还有其他结构合并了两个 'pnumar =' 语句,而不是使用硬编码的 5,但这应该会给你一个想法。

,

本次任务结束后

pnumar=numar;

指针pnumar指向数组numar的第一个元素。

在循环内指针递减

pnumar--;

所以即使在循环的第一次迭代中,指针指向数组之外,程序也有未定义的行为。

你不应该在程序中使用像 5 这样的幻数。

如果您想使用指针输出数组元素,那么变量 contor 是多余的。

程序可以如下所示

#include <stdio.h>

int main( void )
{
    int numar[] = { 100,500 };

    for ( const int *pnumar = numar + sizeof( numar ) / sizeof( *numar ); pnumar != numar; )
    { 
        printf( "%d\n",*--pnumar );
    }
}

程序输出为

500
400
300
200
100

您可以编写一个单独的函数,在任何流中以相反的顺序输出一个数组。例如

#include <stdio.h>

FILE * reversed_output( const int a[],size_t n,FILE *fp )
{
    for ( const int *p = a + n; p != a; )
    {
        fprintf( fp,"%d\n",*--p );
    }
    
    return fp;
}

int main( void )
{
    int numar[] = { 100,500 };


    fputc( '\n',reversed_output( numar,sizeof( numar ) / sizeof( *numar ),stdout ) );
}

程序输出与上图相同,只是多了一个空行。

500
400
300
200
100

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。