C语言问题 指针跟数组的问题

来源:百度知道 编辑:UC知道 时间:2024/07/01 14:23:56
main()

{

int a1[5][5]={{90,80,70,6,7},{1,80,5,10,11},{2,9,10,11,12},{4,9,30,32,32},{3,5,9,8,7}},d1[4];
int a,b,y;
int *p1=a1;

for(a=0;a<4;a++)
{
for(b=a;b<25;b++)
{
if(*(p1+a)>*(p1+b))
{y=*(p1+a);
*(p1+a)=*(p1+b); /*用指针的求出这个数组里最小的四位*/
*(p1+b)=y;
d1[a]=b;
}
}

}

for(a=0;a<=3;a++)
printf("%d \t\n",d1[a]); /*输出选择出来最少四位下标*/

for(a=0;a<5;a++)
{
for(b=0;b<5;b++) /*这双重循环输出已经排列好的位置*/
printf("%d\t",a1[a][b]);
puts("");}
getch();

}

就是这个程序的下标应该是5 10 20 15的 为什么最后两个同时20我就不明白了
我要知道这程序要怎么样才能输出我要的下那个最后一个下标不是20而是15

在进行寻找第3小数时,会将a1[3][0]放到a1[4][0],最终导致出现问题。这个算法不严谨。
还有就是一楼的回答不正确,在这个程序中指针是可以那样定义的。

那么怎么修改呢?可以进行判断。若在此比较交换后还有比之更小的,那么在交换之前先将原来的换回来,这个操作起来很简单,只需要引入2个参数用来存放之前两个数的位置就行。

int *p1=a1;//这个指针定义有问题,在二维数组里应该这样定义:
int *p1=a1[5];
另外最后一行:getch();做何用???可以删除
下面的代码吃饭回来再看

因为你进行交换了,交换是把当前比较过的元素中最小的交换到指定位置。按你的数据,当a=3时,比较到4,会把4放到数组的第三个位置上,遇到3之前,不会有交换,到了3会交换3和4的位置,这样4就跑到20那里去了,所以第四遍的时候得出的就是20。其实这样的操作只能保证最小的元素的下标是正确的。另外,你输出的数组并不是完全有序的,因为你只进行了4次排序。