Как я могу изменить переменную, которая передается функции в качестве параметра? - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь изменить некоторые переменные внутри структуры с помощью функции, которая возвращает void.Функция принимает член Struct в качестве параметра, массив структур и размер.Функция имеет некоторый код, который в конце меняет некоторые переменные внутри члена структуры.Однако я знаю, что когда вы передаете что-то в функцию в качестве параметра, вы работаете с копией, а не с оригиналом.И, следовательно, изменения, внесенные в член структуры, не будут «сохранены».

Я провел некоторое исследование по этой теме и обнаружил, что указатели являются одним из способов решения этой проблемы.Проблема в том, что я не знаю, как использовать указатели, и объяснения, которые я нашел, немного сбивают с толку.

Являются ли указатели единственным способом сделать это?И если так, может кто-нибудь объяснить / показать мне, как использовать указатели в этой конкретной ситуации?

1 Ответ

2 голосов
/ 05 мая 2019

Как я могу изменить переменную, которая передается функции в качестве параметра [...], используя функцию, которая возвращает void [...]

Являются ли указатели единственным способом сделать это?

Да.

Пример, как это сделать:

#include <stdio.h> /* for printf() */

struct S
{
  int i;
  char c;
};

void foo(struct S * ps)
{
  ps->i = 42;
  ps->c = 'x';
}

int main(void)
{
  struct S s = {1, 'a'}; /* In fact the same as: 
  struct S s;
  s.i = 1;
  s.c = 'a'
  */

  printf(s.i = %d, s.d = %c\n", s.i, s.c);

  foo(&s);

  printf(s.i = %d, s.d = %c\n", s.i, s.c);
}

Печать:

s.i = 1, s.d = a
s.i = 42, s.d = x    

Другой пример (взят из / на основе Bruno удаленный ответ ):

void f(int * v1, float * v2)
{
  *v1 = 123; // output variable, the previous value is not used
  *v2 += 1.2; // input-output variable
}

int main(void)
{
  int i = 1;
  float f = 1.;

  f(&i, &f);
  // now i values 123 and f 2.2

  return 0;
}
...