Ссылки (references) и указатели (pointers) в C++ служат для работы с памятью и позволяют передавать и изменять данные по адресу. Однако у них есть важные различия, которые влияют на использование и безопасность кода.
🚩Подробное объяснение с примерами
🟠Ссылка – это псевдоним для переменной
Ссылка является просто альтернативным именем для существующей переменной. Она не может существовать без объекта, к которому привязана.
#include <iostream>
void modify(int& ref) {
ref = 20; // Меняем значение переданного объекта
}
int main() {
int a = 10;
int& refA = a; // refA теперь синоним a
std::cout << "До: " << a << std::endl; // 10
modify(refA);
std::cout << "После: " << a << std::endl; // 20
return 0;
}
🟠Указатель – это переменная, хранящая адрес
Указатели могут указывать на разные переменные, быть
nullptr, поддерживают арифметику. #include <iostream>
void modify(int* ptr) {
if (ptr) {
*ptr = 30; // Разыменование указателя для изменения значения
}
}
int main() {
int a = 10;
int* ptrA = &a; // ptrA хранит адрес a
std::cout << "До: " << a << std::endl; // 10
modify(ptrA);
std::cout << "После: " << a << std::endl; // 30
return 0;
}
Указатели могут менять адреса, ссылки – нет
int a = 10, b = 20;
int* ptr = &a; // ptr указывает на a
ptr = &b; // Теперь ptr указывает на b
int& ref = a; // ref – это псевдоним a
ref = b; // Это НЕ смена привязки! Теперь a == 20
🟠Арифметика указателей
Указатели позволяют выполнять арифметические операции, что полезно при работе с массивами.
int arr[] = {1, 2, 3};
int* ptr = arr; // ptr указывает на первый элемент
std::cout << *ptr << std::endl; // 1
std::cout << *(ptr + 1) << std::endl; // 2 (следующий элемент)
std::cout << *(ptr + 2) << std::endl; // 3🚩Когда использовать ссылки, а когда указатели?
Используйте ссылки, если объект гарантированно существует и не должен изменять свою привязку
Используйте указатели, если нужна возможность "ни на что не указывать" (
nullptr) или менять адрес В большинстве случаев лучше использовать ссылки, так как они безопаснее
Ставь 👍 и забирай 📚 Базу знаний