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

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

Какие точные переменные (из массива указателей) я передаю в функцию подкачки?

Не использование свопа в качестве функции, а просто копирование этого непосредственно в сортировку работает.

typedef struct team
{
  int val;
} team;

void swap(team *t1, team *t2);
void sort(team *t[4]);

void swap(team *t1, team *t2)
{
  team *t = t1;
  t1 = t2;
  t2 = t;
}

void sort(team *t[4])
{
  printf("t[0] is %d\n", t[0]);
  // I have a sorting algorithm here that uses this swap
  swap(t[0], t[1]);
  printf("t[0] is %d\n", t[0]);
}

int main()
{
  team table[4] = {2, 6, 7, 8};
  team *aop[4] = {&table[0], &table[1], &table[2], &table[3]};
  sort(aop);
  return 0;
}

Кстати, я здесь полный нуб, любые другие советы о том, как задать вопрос или написать кодв целом будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Используемая вами функция подкачки принимает каждый из своих аргументов-указателей по значению, однако для желаемой функциональности их необходимо брать по ссылке (указателю).

Различие, которое следует здесь сделать, заключается в том, что подкачка принимает значения типа team по ссылке (указателю) (т.е. team *), но принимает значения типа team * по значению. Следовательно, он только меняет свои локальные ссылки, поэтому он работает, если он напрямую вставлен в вашу sort функцию.

Вместо этого рассмотрим следующую реализацию swap

void swap(team **t1, team **t2)
{
  team *t = *t1;
  *t1 = *t2;
  *t2 = t;
}

В этом случае swap принимает (указатель) ссылки на значения типа team * и заменяет их. Теперь это будет работать для предполагаемого варианта использования.

0 голосов
/ 12 июня 2019

Ваша swap функция ничего не делает, потому что C использует call by value. Вы должны передать указатель на указатель:

void swap(team **t1, team **t2)
{
  team **t = t1;

  *t1 = *t2;
  *t2 = t;
}

Теперь вы передаете адрес указателя в функцию и манипулируете данными по заданному адресу.

t[0] is 2
t[0] is 6

Вы можете проверить это здесь .

Редактировать: предыдущий был быстрее:)

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