鱼C论坛

 找回密码
 立即注册
查看: 724|回复: 3

[已解决]最大最小值用指针变量索引求助

[复制链接]
发表于 2020-7-24 00:53:03 | 显示全部楼层 |阅读模式
10鱼币
我看的老版小甲鱼老师的视频上面有一个用指针变量来求10个数最大最小值,但我做的这个它max_min_value 函数不知道什么地方出了问题,max和min的判断循环不起作用,p到哪,max,min跟到哪,可能是定义指针变量时的问题 屏幕截图(426).png 屏幕截图(425).png
#include <stdio.h>

int *max, *min;

void max_min_value(int *array, int n);

void main()
{
        int i, number[10];
        printf("enter 10 integer numbers:\n");
        for(i = 0; i < 10; i++)
        {
                scanf("%d", &(number[i]));
        }
        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;
                }
        }
}

这是源代码,望高人指教
最佳答案
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[11];
    printf("enter 10 integer numbers:\n");

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

    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是函数,不是常量表达式

最佳答案

查看完整内容

指针版的也解决了 直接上代码 还是解释一下,程序里 int *min = NULL; min = (int *)malloc(1 * sizeof(int)); *min = *array; 这三句都是必不可少的,对应的步骤是定义全局变量,分配内存空间,赋值 定义时候之所以要指向NULL,就是为了避免出现上面所说的未初始化的指针变量, 分配空间你可以参考更多malloc的资料,这个格式也是常用的一种 还有就是不能把定义变量和分配空间缩减到一起 int *min = (int *)mallo ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[11];
    printf("enter 10 integer numbers:\n");

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

    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是函数,不是常量表达式

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[11];
    printf("enter 10 integer numbers:\n");

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

    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; 这个写法是错误的,因为指针定义必须初始化,否则就会变成指向内容不确定的指针
写成这样编译是正常但是运行时候会出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-24 07:40:33 | 显示全部楼层
SHRS23 发表于 2020-7-24 04:36
指针版的也解决了
直接上代码

感谢大佬不辞辛苦的解释,终于出结果了,我还没看到 老版视频 的分配内存的malloc的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 10:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表