Нужны разъяснения относительно ссылок на массивы в определениях функций и прототипах

0

Я получаю идею, что для MODIFY массива в другой функции мне нужно объявить параметр в качестве ссылки в определении функции:

bool sortInput(ifstream &infile, StudentType (&students)[MAXSIZE], int size)

И я провозгласил прототип аналогичным образом, поскольку он не будет компилироваться должным образом иначе:

bool sortInput(ifstream &, StudentType (&students)[MAXSIZE], int);

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

Я читал бесчисленные другие потоки и поисковые запросы Google, поэтому я уверен, что определение функции правильное, однако нигде оно не указывает правильную форму для прототипа.

Теги:
arrays

2 ответа

1
Лучший ответ

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

  • 0
    Поэтому изменил его на «& size» и удалил все ссылки на массивы, которые я пытался сделать, и теперь все работает правильно. Спасибо! Хотя сейчас это еще больше смущает меня ... так что все, что вы хотите изменить (за исключением массивов), должно быть передано в качестве ссылки?
  • 2
    да или по указателю. Массив уже передан по указателю, так что вы можете изменить его содержимое. Для передачи по указателю некоторой переменной используйте int var; foo(&var); и функция будет void foo(int *var) { int another_var = *var; } Попробуйте найти некоторые статьи о пуатье и ссылки на C ++. Это проясняет ситуацию.
1

Массив уже передан как указатель, поэтому вы уже можете изменить его содержимое. Добавление & не требуется.

  • 2
    Не для этого OP, но это, однако, важно, если вы хотите указать определенный объявленный размер массива. func(int ar[] ) будет принимать все, включая динамический указатель и т. д. Но func(int (&ar)[SIZE]) требует, чтобы вызывающая сторона вызывала только с действительным массивом int[SIZE] . Например, передача int ar[5] приведет к ошибке времени компиляции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню