Как я могу решить эту проблему с указателями в C? - PullRequest
0 голосов
/ 01 ноября 2018

В приведенном ниже коде я пытаюсь реализовать функцию, которая находит максимальное и минимальное значения данного массива. Но я пытался использовать другой подход. Я пытался изменить адрес памяти указателей на максимум и минимум.

Почему это не работает? Должен ли я использовать указатели на указатели для решения этой проблемы?

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

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Единственная причина, по которой вам нужно использовать указатели здесь, заключается в том, что вы хотите вернуть и 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.)

0 голосов
/ 01 ноября 2018

Вы передаете значение (то есть начальный адрес массива), хранящееся в указателях max и min, в функцию maxMin() с помощью maxMin(v, M, max, min). Это означает, что переменные-указатели min и max в main() связаны с переменными-указателями min и max в maxMin() списке аргументов. Таким образом, любое изменение этих переменных в maxMin() не будет отражено в main().

Вам нужно передать адрес переменных min и max и обновить значения *min и *max в функции maxMin (см. Ответ Петра Велева).

0 голосов
/ 01 ноября 2018

Вы должны использовать двойные указатели, потому что, передавая его так, вы скопируете значение указателей.

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

Остальное остается прежним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...