写在前面
前几日老师展示了如何用纯指针找一个二维数组的鞍点(行中最大,列中最小),老师按照常人的思维——先找行中最大再找列中最小。自我认为这种思维比较好理解。课后,老师又布置了一个作业——先找列中最小,再找行中最大。哈哈,起初我是觉得应该差不多的也确确实实差不多,但是实现起来就有一种思维被禁锢(惯性思维)的感觉,难以下手。写了几次都因为思绪突然断线,然后得缓好一会儿。
于是今天我又打开了电脑,重新开始琢磨;同样的我也在纸上写着画着。
功夫不负有心人,写出来了!!
老师在某个地方用了强制类型转换,而我没用,并且我也觉得他写的挺复杂的哈哈哈哈~~
先看看代码:
#include <stdio.h>
int main()
{
int a[3][4]={5,6,7,8,1,2,3,4,9,10,11,12};
int (*p)[4],(*k)[4],*max,*q,*m;
for(q=*a;q<*a+4;q++)//先找列中最小,再找行中最大
{
max=q;
for(p=a,k=p;p<a+3;p++)
if(*(*p+(q-*a))<*max) {max=(*p+(q-*a));k=p;}//找到一列中最小的值
for(m=*k;m<*k+4;m++)
if(*(*k+(m-*k))>*max) break;
if(m>=*k+4) printf("找到鞍点!\na[%d][%d]=%d",k-a,q-*a,*max);
}
return 0;
}
变量定了挺多的,没办法我很菜。
再看看之前测试的代码(就是输出了地址以寻找错误)
#include <stdio.h>
int main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4],(*k)[4],*max,*q,*m;
for(q=*a;q<*a+4;q++)
{
max=q;
for(p=a,k=p;p<a+3;p++)
{
if(*(*p+(q-*a))<*max) {max=(*p+(q-*a));k=p;}//找到一列中最小的值
//printf("p的地址%d,a[%d][%d]的地址%d\n",k,p-a,q-*a,*p+(q-*a));
}
//printf("\n");
for(m=*k;m<*k+4;m++)
{
//printf("m的地址%d\n",m);
//printf("m-*k的值%d\n",m-*k);
if(*(*k+(m-*k))>*max) break;
}
if(m>=*k+4) printf("找到鞍点!\na[%d][%d]=%d",k-a,q-*a,*max);
}
return 0;
}
嗯好的,就这样。