C语言 利用指针实现求数组元素中的最大值和最小值

#include<stdio.h>
#define N 10
void main()
{
int *p,*t,a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
p=a;
t=a;
for(i=1;i<N;i++)
{
if(*p<*(p+i))
p=p+i;
if(*t>*(t+i))
t=t+i;
}
printf("%d %d\n",*p,*t);
}
帮忙找个错…… 如果第一为是最大值那么此程序就能正常输出 但是如果第一位输入的不是最大值 此程序第一个输出是个很大的数 最小值也能正常输出…… 谢谢帮忙……
谢谢大家 我想要的不是答案 是错误…… 4楼的差一点看懂 还能再解释一下么……?
我明白了…… 应该这样说……
第一次循环执行p=p+i时p所存放的地址得到了改变 那么在循环第二次走到if(*p<*(p+i))时 *(p+i)里的p已经是p+1了再+2实际上就跳过了a[2]而用a[3]去比较了……

这个乍一看没有错误 但我把你打程序抄近TC运行了一下 发现不是像你说的那样的错误 及时第一位是最大的也会输出错误 无论怎么 输出的第一位都是24940 最小的也有错误 最小有时会输出最大

后来仔细看了一下 发现你后面一个for循环里有大错误 if语句是进行比较 就第一个if来说 你把a[0]与a[1]先进行比较 这里你用的是p=p+i; 就是使p指向p+i所指向的内存 但需要注意 假设我输入的一组数是 9 10 8 5 15 4 2 3 11 1 当进行第一次循环后 p会指向p+1 既然是用p=p+i; 这是p+1就变成了p 当计算机再进行循环至a[4] 也就是15时 就会有p=p+4; 而这时想对于刚开始时的指针p就已经不是指向你想要他指的那个数(也就是大的那个)了 此时的指针p与刚开始的比其实不是指向了p+4 而是指向了p+5 也就是4了
所以程序出现了这般错误

要改正的话只要把后面那个for循环换成如下程序段就可以了:

for(i=1;i<N;i++)
{
if(*p<a[i])
*p=a[i];
if(*t>a[i])
*t=a[i];
}

如果规定要用指针的话那可以再定义两个中间指针变量应该可以解决

只能说这么多了 太晚了 要睡觉了~~ 不然明天第一节课又没得上了

希望我的答案对你有帮助 嘿嘿!!
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-02-19

可以通过定义一个指针变量来求数组元素中的最大值与最小值。

具体实现方法可以参考如下程序:

#include<stdio.h>
void main()
{
    double a[] = {3, 4.2, 4, 5.3, 1, 0.4, 5};
    double *max=(double *)malloc(sizeof(double));  // 最大值指针
    double *min=(double *)malloc(sizeof(double));  // 最小值指针
    int i;
    *max = a[0]; // 初始化最大值
    *min = a[0]; // 初始化最小值
    for(i=1; i<7; i++) // 7表示数组a的长度
    {
        if(*max<a[i])
            *max = a[i];  // 保存最大值
        if(*min>a[i])
            *min = a[i];  // 保存最小值  
    }
}

第2个回答  2008-10-13
#include<stdio.h>
#define N 10
void main()
{
int *p,*t,a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
p=a;
t=a;
int max = *p;
int min = *t;
for(i=1;i<N;i++)
{
if(max < *(p+i))
max = *(p + i);

if(min > *(t+i))
min = *(t + i);
}
printf("%d %d\n",max,min);
}

测试通过;

你的错误是因为在 p=p+i 时 p的指向可能 跳过了几个数,而你在下次循环时,i还是以p指向数组的开始位置计数的,所以造成了数组超界
第3个回答  2008-10-13
#include<stdio.h>
#define N 10
void main()
{
int *p,*t,*z,a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);

p=a;
t=a;
z=a;
for(i=0;i<N;i++)
{
if(*z<*(p+i))
{
z=p+i;
}
if(*t>*(p+i))
t=p+i;
}
printf("%d %d\n",*z,*t);
}

vc调试通过
第4个回答  2008-10-13
if(*p<*(p+i))
p=p+i;
if(*t>*(t+i))
t=t+i;
这一段有点问题
p和t一直在加
加到后来一准就出去了
改成:
{
if(*p<a[i])
p=a+i;
if(*t>a[i])
t=a+i;
}
P和t不参与数组的遍历
相似回答