学理爱文 发表于 2019-3-21 22:13:34

C语言关于指针

/*一维数组a,求数组内最大的元素值和最小的元素值*/
#include <stdio.h>

void main()
{
    int a;
    int i;
        int *p;
    void max_min(int *arr, int n);
   
    printf("请输入10个数:");
    for(i=0 ; i<10 ; i++)
    {
      scanf("%d", &a);
    }
    //max_min(a, 10);
        p = &a;
    max_min(p, 10);
}

void max_min(int *arr, int n)
{
    int *max, *min, *j, *m;
    max = min = arr;
    j = arr + 1;
    m = arr + n;
    for( ; j<m ; j++)
    {
      if(*j > *max)
      {
                        *max = *j;
            //max = j;
      }
      if(*j < *min)
      {
                        *min = *j;
            //min = j;
      }
    }
        printf("最大值为%d,最小值为%d\n",*max, *min);
}

在程序判断最大最小值中使用*max = *j和*min = *j为什么最后输出的都是数组的最后一个数?求解......

910201513 发表于 2019-3-21 23:15:48

本帖最后由 910201513 于 2019-3-21 23:25 编辑

if(*j > *max)
      {
                        *max = *j;
            //max = j;
      }
      if(*j < *min)
      {
                        *min = *j;
            //min = j;
      }
这两个判断语句在每次for循环中只会有一个执行,不会同时执行
这个max_min(int *arr, int n)函数的通俗讲法就是
先让第一个数既是最小值也是最大值
用将十个数依次赋给*j,每次赋完值,哪这个数和最大最小值比较,比最大值大的话就把这个值给最大值,比最小值小的话就赋给最小值,最后输出最大值最小值

函数max_min(int *arr, int n)不用指针的写法
int main(void)
{
        int a = { 4,3,2,1,0,9,8,7,6,5 };
        int max, min;
        max = a;
        min = a;
        for (int i = 0; i < 10; i++)
        {
                if (a > max)
                        max = a;
                else;

                if (a < min)
                        min = a;
                else;
        }
        printf("max=%d    min=%d", max, min);

        return 0;
}

ba21 发表于 2019-3-21 23:16:35

这代码看了真特么揪心。
先指出1点a;数组传名字就是指针int *p;p = &a;多余中的多余;max_min(p, 10);换成max_min(a, 10);就好。
至于void max_min(int *arr, int n)真的无法直视。能自己写代码是好的,建议还是多参考别人的代码。

jackz007 发表于 2019-3-21 23:20:45

本帖最后由 jackz007 于 2019-3-21 23:26 编辑

    max = min = arr                                       ; // min , max 均指向数组第 1 个元素
. . . . . .
      if(* j > * max) * max = * j                     ; // 由于 max = min 所以,修改 * max 便等于修改 * min ,同时,改变了数组的第 1 个元素,这应该不是所期望的。
      if(* j < * min) * min = * j                     ; // 由于 min = max 所以,修改 * min 便等于修改 * max ,同时,改变了数组的第 1 个元素,这应该不是所期望的。
          正确的做法是,记录指向最大、最小值的指针,而不是记录这个值本身。改成这样才对:
      if(* j > * max) max = j                           ; // 如果 j 指向的元素值大于当前记录在案的最大值,那么就更新、记录这个指针
      if(* j < * min) min = j                           ; // 如果 j 指向的元素值小于当前记录在案的最小值,那么就更新、记录这个指针

蜜蜂. 发表于 2019-3-22 00:13:10

int main()
{
        int array;
        int a = {0};
        int b = {0};
        for(int i = 0;i < 10;i++)
        {
                printf("请输入第%d个数:",i+1);
                scanf("%d",&array);
                printf("\n");
        }

        a = array;
        for(int i = 0;i < 10;i++)
        {
                if(a < array)
                {
                        a = array;
                        b = i;
                }
               
                if(a > array)
                {
                        a = array;
                        b = i;
                }

        }
        printf("最大的:%d下标:%d\n",a,b);
        printf("最小的:%d下标:%d\n",a,b);
        return 0;
}

学理爱文 发表于 2019-3-22 10:06:14

jackz007 发表于 2019-3-21 23:20
正确的做法是,记录指向最大、最小值的指针,而不是记录这个值本身。改成这样才对:

嗯嗯,确实修改*max就等于修改*min,这一点我没有想到,谢谢啦

学理爱文 发表于 2019-3-22 10:07:18

蜜蜂. 发表于 2019-3-22 00:13
int main()
{
        int array;


谢谢回复{:5_108:}

学理爱文 发表于 2019-3-22 10:08:33

ba21 发表于 2019-3-21 23:16
这代码看了真特么揪心。
先指出1点a;数组传名字就是指针int *p;p = &a;多余中的多余;max_min(p, 10 ...

额。。。确实是,这已经不止是格式的问题了,谢谢你的建议{:5_106:}

学理爱文 发表于 2019-3-22 10:09:07

910201513 发表于 2019-3-21 23:15
这两个判断语句在每次for循环中只会有一个执行,不会同时执行
这个max_min(int *arr, int n)函数的通俗 ...

谢谢回复{:5_108:}
页: [1]
查看完整版本: C语言关于指针