繁体   English   中英

如何使用C中的指针解决此问题?

[英]How can I solve this problem with pointers in C?

在下面的代码中,我试图实现一个函数,该函数查找给定数组的最大值和最小值。 但是我试图使用另一种方法。 我试图将指针的内存地址更改为最大值和最小值。

为什么这不起作用? 我应该使用指针来解决此问题吗?

#include <stdio.h>
#define M 5

void maxMin(int *v, int N, int *max, int *min){
    int i;
    printf("%d\n",*v);
    printf("%d\n",*max);
    for(i = 0; i < M; i++){
        if(*max < *(v+i)){
            max = (v+i);
        }
        if(*min > *(v+i)){
            min = (v+i);
        }
    }
}

int main(){
    int v[M] = {1, 3, 5, 7, 8}, *max=v, *min=v;
    maxMin(v, M, max, min);

    printf("MAX %d\n", *max);
    printf("MIN %d\n", *min);
    return 0;
}

您应该使用双指针,因为这样传递它会复制指针的值。

void maxMin(int *v, int N, int **max, int **min){
    int i;
    int minVal = *v;
    int maxVal = *v;
    for(i = 0; i < M; i++){
        if(maxVal < *(v+i)){
            maxVal = *(v+i);
            *max = (v+i);
        }
        if(minVal > *(v+i)){
            minVal = *(v+i);
            *min = (v+i);
        }
    }
}

然后,您可以像这样调用该函数。

maxMin(v, M, &max, &min);

其余的保持不变。

您需要在此处使用指针的唯一原因是,您希望同时返回min和max,但是一个函数只有一个返回值。 因此,您必须通过参数返回它们。

#include <stdio.h>
#define M 5

void maxMin(size_t n, const int v[n], int *max, int *min)
{
  *max = v[0];
  *min = v[0];

  for(size_t i = 1; i < n; i++)
  {
    if(*max < v[i])
    {
      *max = v[i];
    }
    if(*min > v[i]){
      *min = v[i];
    }
  }
}

int main (void)
{
  int v[M] = {1, 3, 5, 7, 8};
  int max;
  int min;

  maxMin(M, v, &max, &min);

  printf("MAX %d\n", max);
  printf("MIN %d\n", min);
  return 0;
}

(返回两个指向max和min元素的指针将是一个奇怪的接口-在这种情况下,您宁愿返回可以找到max和min的索引。)

您正在使用maxMin(v, M, max, min)将存储在指针maxmin的值(即数组的起始地址)传递给函数maxMin() maxMin(v, M, max, min) 这意味着main()中的指针变量minmaxmaxMin()参数列表中的minmax指针变量有关。 因此,在maxMin()对这些变量所做的任何更改都不会反映在main()

您需要做的是传递minmax变量的地址,并在函数maxMin更新*min*max的值(请参见Petar Velev答案)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM