【问题标题】:How can I solve this problem with pointers in C?如何用 C 中的指针解决这个问题?
【发布时间】:2019-04-05 17:29:02
【问题描述】:

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

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

#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;
}

【问题讨论】:

  • max 指向数组。当你传递max 时,你传递了一个指针。该函数接收该指针的副本。当您在函数内部修改它时,调用者将看不到它。要修改指针并让调用者看到它,请传递一个“双指针”,即指针的地址
  • 这与您的问题无关,但是您的代码中的参数 N 和全局宏 M 之间存在一些混淆。在您的示例中它不会导致任何问题,因为它们是相同的,但 maxMin 应该在其正文中引用“N”而不是“M”。
  • 请记住,C 传递参数按值,这意味着函数内部的参数变量是副本。并且修改副本不会修改原始文件。请做一些关于在C中模拟通过引用传递的研究。

标签: c algorithm pointers


【解决方案1】:

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

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);

其余的保持不变。

【讨论】:

  • 我认为有一个错字。参数为int N,但for循环引用M
  • @AustinMullins 在问题中是这样的。这可能是一个错字,但不是我的:)。查看问题中的宏 M。
【解决方案2】:

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

#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 的索引。)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2016-01-24
      • 1970-01-01
      • 2012-10-30
      • 2010-12-18
      • 2021-07-28
      • 2020-06-07
      相关资源
      最近更新 更多