wlp1818100227 发表于 2020-7-24 00:53:03

最大最小值用指针变量索引求助

我看的老版小甲鱼老师的视频上面有一个用指针变量来求10个数最大最小值,但我做的这个它max_min_value 函数不知道什么地方出了问题,max和min的判断循环不起作用,p到哪,max,min跟到哪,可能是定义指针变量时的问题
#include <stdio.h>

int *max, *min;

void max_min_value(int *array, int n);

void main()
{
        int i, number;
        printf("enter 10 integer numbers:\n");
        for(i = 0; i < 10; i++)
        {
                scanf("%d", &(number));
        }
        max_min_value(number, 10);
        printf("max = %d, min = %d", *max, *min);
}

void max_min_value(int *array, int n)
{
       
    int *p, *array_end;
        array_end = array + n;
    min = array;
        max = array;
        for(p = (array+1); p < array_end; p++)
        {
      if(*p > *max)
                {
                        *max = *p;
                }
                else if(*p < *min)
                {
                        *min = *p;
                }
        }
}

这是源代码,望高人指教

SHRS23 发表于 2020-7-24 00:53:04

指针版的也解决了
直接上代码
#include <stdio.h>
#include <stdlib.h>

int *min = NULL;
int *max = NULL;

void max_min_value(int *array, int n);

void main()
{
    int i, number;
    printf("enter 10 integer numbers:\n");

    for(i = 0; i < 10; i++)
    {
      scanf("%d", &number);
    }

    max_min_value(number, 10);
    printf("max = %d, min = %d", *max, *min);
    system("pause");
}

void max_min_value(int *array, int n)
{
    int *p, *array_end;
    array_end = array + n;
    min = (int *)malloc(1 * sizeof(int));
    max = (int *)malloc(1 * sizeof(int));
    *max = *array;
    *min = *array;

    for(p = (array); p < array_end; p++)
    {
      if(*p > *max)
      {
            *max = *p;
      }

      if(*p < *min)
      {
            *min = *p;
      }
    }
}


还是解释一下,程序里
int *min = NULL;
min = (int *)malloc(1 * sizeof(int));
*min = *array;
这三句都是必不可少的,对应的步骤是定义全局变量,分配内存空间,赋值
定义时候之所以要指向NULL,就是为了避免出现上面所说的未初始化的指针变量,
分配空间你可以参考更多malloc的资料,这个格式也是常用的一种

还有就是不能把定义变量和分配空间缩减到一起
int *min = (int *)malloc(1 * sizeof(int));
在main函数内部的局部变量可以这样搞,但是对于全局变量(main以外)
初始化时候必须是常量表达式,如果写成这个样子编译器会报一个错误“常量表达式中不允许函数调用”
因为malloc是函数,不是常量表达式

SHRS23 发表于 2020-7-24 04:14:44

本帖最后由 SHRS23 于 2020-7-24 04:17 编辑

先说比较明显的问题,第一是数组定义的长度不够,第二个读入的地方写错了,第三是min = array;max = array;这里我觉得你的本意应该是把数组的第一个值赋给min和max,但是你这样写实际上是传递的地址,导致在后面每一次对*min赋值,*max也会变化,反过来对*max赋值,*min也变化。

底下的代码是我修改的可以正常运行的代码

#include <stdio.h>
#include <stdlib.h>

int max = INT_MIN;
int min = INT_MAX;

void max_min_value(int *array, int n);

void main()
{
    int i, number;
    printf("enter 10 integer numbers:\n");

    for(i = 0; i < 10; i++)
    {
      scanf("%d", &number);
    }

    max_min_value(number, 10);
    printf("max = %d, min = %d", max, min);
    system("pause");
}

void max_min_value(int *array, int n)
{
    int *p, *array_end;
    array_end = array + n;

    for(p = (array); p < array_end; p++)
    {
      if(*p > max)
      {
            max = *p;
      }

      if(*p < min)
      {
            min = *p;
      }
    }
}


说明一下:
首先指针的内容我忘差不多了,试了一下用你的思路把min,max定义成全局指针变量没有成功,所以直接用了普通的int变量
两个常量值
#define INT_MIN   (-2147483647 - 1)
#define INT_MAX       2147483647
定义在C语言库文件limits.h
这是找最大最小的常用操作,就是初始时候把最大值设置成极小,最小值设置成极大,保证你想要比较的每一个值都能正常进行判断

还有一点就是你程序开头int *max, *min; 这个写法是错误的,因为指针定义必须初始化,否则就会变成指向内容不确定的指针
写成这样编译是正常但是运行时候会出错

wlp1818100227 发表于 2020-7-24 07:40:33

SHRS23 发表于 2020-7-24 04:36
指针版的也解决了
直接上代码



感谢大佬不辞辛苦的解释,终于出结果了,我还没看到 老版视频 的分配内存的malloc的内容{:5_109:}
页: [1]
查看完整版本: 最大最小值用指针变量索引求助