Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Передача по ссылке в C++ через указатели: практические примеры

Передача по ссылке в C++ через указатели: практические примеры

Это руководство объясняет, как передавать аргументы по ссылке в C++ с использованием указателей, с наглядными примерами обмена значениями и не только.

В мире функций C++ способ передачи данных по умолчанию — по значению: функция получает копию исходных данных. Это защищает оригинальную переменную, но неэффективно для больших объектов и не позволяет функции изменять данные вызывающего кода.

Передача по ссылке решает обе проблемы. Вместо копирования данных функция получает ссылку (или адрес) на исходную переменную, позволяя прямое манипулирование. Это достигается двумя эквивалентными способами: через ссылки C++ или через сырые указатели. Понимание обоих подходов даёт гибкость и глубокое понимание работы с памятью.

// Функция, принимающая значение
void func1(int numVal) {
    // код
}

// Функция, принимающая ссылку (синтаксис ссылок C++)
void func2(int &numRef) {
    // код
}

int main() {
    int num = 5;
    // Передача по значению
    func1(num);
    // Передача по ссылке
    func2(num);
    return 0;
}

Символ & в void func2(int &numRef) указывает, что параметр — это ссылка. При вызове func2 передаётся адрес num, а не его значение, что позволяет функции изменять num напрямую.

Передача по ссылке в C++ через указатели: практические примеры

Пример 1: Обмен значениями с использованием ссылок C++

#include <iostream>
using namespace std;

// Функция обмена с использованием ссылок
void swap(int &n1, int &n2) {
    int temp = n1;
    n1 = n2;
    n2 = temp;
}

int main() {
    int a = 1, b = 2;
    cout << "Before swapping\n";
    cout << "a = " << a << "\n";
    cout << "b = " << b << "\n";
    
    swap(a, b);
    
    cout << "\nAfter swapping\n";
    cout << "a = " << a << "\n";
    cout << "b = " << b << "\n";
    return 0;
}

Вывод

Before swapping
a = 1
b = 2
After swapping
a = 2
b = 1

В этом примере swap получает две ссылки. Поскольку n1 и n2 являются псевдонимами для a и b, изменения внутри функции затрагивают исходные переменные.


Пример 2: Обмен значениями с использованием указателей

#include <iostream>
using namespace std;

// Прототип функции с указателями
void swap(int*, int*);

int main() {
    int a = 1, b = 2;
    cout << "Before swapping\n";
    cout << "a = " << a << "\n";
    cout << "b = " << b << "\n";
    
    // Передача адресов a и b
    swap(&a, &b);
    
    cout << "\nAfter swapping\n";
    cout << "a = " << a << "\n";
    cout << "b = " << b << "\n";
    return 0;
}

// Функция обмена с использованием указателей
void swap(int* n1, int* n2) {
    int temp = *n1;
    *n1 = *n2;
    *n2 = temp;
}

Вывод

Before swapping
a = 1
b = 2
After swapping
a = 2
b = 1

Здесь swap принимает сырые указатели. Разыменовывая их через *, функция обращается к значениям по переданным адресам и изменяет их. Результат идентичен версии со ссылками, но синтаксис указателей делает передачу адресов явной.

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

Сравнение подходов

АспектСсылки (T&)Указатели (T*)
Синтаксис вызоваfunc(a)func(&a)
Нулевой указательНевозможен (в безопасном коде)Возможен (требует проверки)
ПеренаправлениеНельзя изменить после инициализацииМожно менять адрес
Арифметика указателейНетДа
РекомендацияПо умолчанию для передачи по ссылкеДинамическая память, опциональные параметры, C-совместимость

Язык C

  1. Освоение операторов using в C#: импорт, псевдонимы и статические директивы
  2. Освоение операторов C++: полное руководство с практическими примерами
  3. Комментарии в C++: лучшие практики для читаемого и поддерживаемого кода
  4. Шаблоны классов в C++: практическое руководство
  5. Освоение указателей в C: практическое руководство от экспертов
  6. Указатели в C++: концепции, примеры и практические применения
  7. 13 типов вредоносного ПО в 2021 году: угрозы, примеры и защита
  8. 5 моделей центров обработки данных: дизайн, кейсы и примеры
  9. Изучение 8 ключевых технологических трендов 2021 года с реальными примерами
  10. Указатели в C: полное руководство — объявление, арифметика, массивы, функции и динамическая память