读书人

请高手纠正异常

发布时间: 2012-04-08 14:38:30 作者: rapoo

请高手纠正错误!
将5*5矩阵中心放上最大值,四个角顺序为从上到下,从左到右一次放最小的四个值,以下是我写的代码,请高手纠正以下错

误,并注释,刚学指针,郁闷啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <stdio.h>
#define N 5
/* *pa用于接收主函数传送的数组首地址,*pm用于接收主函数传送的最小数*/

void main ()
{
int *min(int *,int *);
int a[N][N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
int *pa=*a; //定义指针变量,使其指向数组a的首地址;
int *pm=*a;//此指针用于对最小数的比较;
int *p,*t=0,temp;
for (p=pa+N*N;pa<p;pa++)
if (*t<*pa) t=pa;
pa=*a;
temp=*(*(pa+2)+2);*(*(pa+2)+2)=*t;*t=temp;//找出最大值,并完成将最大值放入矩阵的中心;
pm=min(pa,pm);
temp=*(*pa);*(*pa)=*pm;*pm=temp;//找出第一个最小数,将其放置矩阵的左上角;
pm=min(pa,pm);
temp=*(*pa+4);*(*pa+4)=*pm;*pm=temp;//找出第二个最小数,将其放置矩阵的右上角;
pm=min(pa,pm);
temp=*(*(pa+4));*(*(pa+4))=*pm;*pm=temp;//找出第三个最小数,将其放置矩阵的左下角;
pm=min(pa,pm);
temp=*(*(pa+4)+4);*(*(pa+4)+4)=*pm;*pm=temp;//找出第四个最小数,将其放置矩阵的右下角;
for (p=pa+N*N;pa<p;pa++)
{
if ((pa-*a)%N==0) printf ("\n");
printf("%d ",*pa);
printf("\n");
}
}
int *min(int *pa,int *pm)/*找出最小数函数体*/ //比较出4个最小数,必须每次传递数组的首地址,然后是一个最小数。
{
int *p; //用于计算最大地址;
int *t;
for (t=pa,p=pa+N*N;pa<p;pa++)
if (*t>*pa&&*t>*pm) t=pa;
return t;
}

[解决办法]
这种纯逻辑的问题真心很难看懂,并且你的代码也确实难看全是*,把能换成变量名称的用变量名表示,需要使用地址的地方使用‘&’取址传递,如a[2][2]不是很容易董么为什么非要写成**a,不是不可以,当你通篇都是*的时候就很少有人有耐心看了
[解决办法]
全是*,只看了一眼头就晕了。。。。
[解决办法]
你将*(*(p+2)+2)改成*(p+12),以此类推,你将指针无形中升级了p、pa、pm都是一级指针,你把它们作为二级指针使用,出错也就很正常了

读书人网 >C语言

热点推荐