Назад к вопросам
Junior
88
questionbank
Расскажи о способах передачи параметров в функции на языке C/C++.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Существует три основных способа передачи параметров в функции на C/C++:
-
Передача по значению (Pass by Value)
- В функцию передается копия значения аргумента.
- Изменения параметра внутри функции не влияют на исходный аргумент вне ее.
- Безопасно, но может быть неэффективно для больших объектов из-за создания копии.
void func_by_value(int x) { x = x * 2; // Изменяется только локальная копия } int main() { int a = 5; func_by_value(a); // a по-прежнему равно 5 return 0; } -
Передача по ссылке (Pass by Reference)
- В функцию передается псевдоним исходной переменной.
- Изменения параметра внутри функции напрямую влияют на исходный аргумент.
- Эффективно, так как не создается копия.
- Можно использовать константные ссылки (
const &) для предотвращения изменений.
void func_by_reference(int& x) { x = x * 2; // Изменяет исходную переменную } int main() { int a = 5; func_by_reference(a); // a теперь равно 10 return 0; } -
Передача по указателю (Pass by Pointer)
- В функцию передается адрес исходной переменной.
- Изменения параметра через разыменование указателя (
*) влияют на исходный аргумент. - Требует дополнительной проверки указателя на
nullptr. - Позволяет передавать "нулевое" значение (
nullptr), указывая на отсутствие объекта.
void func_by_pointer(int* x) { if (x != nullptr) { *x = *x * 2; // Изменяет значение по адресу, на который указывает x } } int main() { int a = 5; func_by_pointer(&a); // Передаем адрес переменной a // a теперь равно 10 func_by_pointer(nullptr); // Пример передачи нулевого указателя return 0; }
| Способ | Что передается | Изменение оригинала | Эффективность (для больших объектов) | Безопасность (изменения) | Возможность "нулевого" значения | Синтаксис вызова |
|---|---|---|---|---|---|---|
| По значению | Копия значения | Нет | Низкая | Высокая | Нет | функция(переменная) |
| По ссылке | Псевдоним переменной | Да | Высокая | Низкая (если не const) |
Нет | функция(переменная) |
| По указателю | Адрес переменной | Да (через *) |
Высокая | Средняя (нужна проверка) | Да (nullptr) |
функция(&переменная) |