问题描述
我的程序有什么问题,应该按降序打印数组的内容?
想要的输出:
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++);
}
,
当您将 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