Menu
Coddy logo textTech

Указатели и ссылки

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 13 из 104.

Теперь, когда ты понимаешь стековую и динамическую память, давай изучим инструменты, которые позволяют напрямую работать с ячейками памяти: pointers и references.

pointer хранит memory address другой переменной. Его объявляют с помощью * и получают address с помощью &.

int value = 42;
int* ptr = &value;    // ptr хранит адрес value

std::cout << ptr;     // Выводит адрес памяти
std::cout << *ptr;    // Разыменование: выводит 42

reference — это alias для существующей переменной. После связывания он всегда ссылается на эту переменную. Объявить его можно с помощью &.

int value = 42;
int& ref = value;     // ref является псевдонимом для value

ref = 100;            // Изменяет value на 100
std::cout << value;   // Выводит 100

Ключевые различия:

УказателиСсылки
Могут быть nullДолжны быть инициализированы
Могут быть переназначеныНе могут быть переназначены
Используйте *, чтобы получить доступ к значениюПолучайте доступ к значению directly
Могут указывать в никудаВсегда действительны

both необходимы для эффективной передачи объектов в функции без копирования и для работы с памятью, выделенной в куче. Ссылки безопаснее и проще, тогда как pointers предоставляют больше гибкости, когда нужно переназначить их или проверить на null.

challenge icon

Задание

Легко

Давайте создадим простую систему манипуляции значениями, демонстрирующую, как pointer и reference по-разному работают при изменении данных.

Вы создадите два файла, чтобы организовать свой код:

  • ValueOps.h: define three functions, которые изменяют значения типа integer разными способами:
    • doubleByPointer(int* ptr): takes pointer и удваивает значение, на которое он указывает
    • tripleByReference(int& ref): takes reference и утраивает значение
    • swapValues(int* a, int* b): takes two pointers и меняет местами значения, на которые они указывают
  • main.cpp: Read two integers from input, затем продемонстрируйте работу pointers и references:
    • Выведите Original values: "Original: <first> <second>"
    • Используйте doubleByPointer для first value, затем выведите: "After double: <first>"
    • Используйте tripleByReference для second value, затем выведите: "After triple: <second>"
    • Используйте swapValues, чтобы поменять местами both values, затем выведите: "After swap: <first> <second>"

При вызове functions с pointers не забудьте использовать оператор взятия address (&), чтобы передать address переменной. References работают более естественно: просто передайте переменную directly.

Подключите свой header file в main.cpp с помощью #include "ValueOps.h".

Попробуйте сами

#include <iostream>
#include "ValueOps.h"
using namespace std;

int main() {
    // Прочитать два целых числа из ввода
    int first, second;
    cin >> first;
    cin >> second;
    
    // Вывести исходные значения
    cout << "Original: " << first << " " << second << endl;
    
    // TODO: Использовать doubleByPointer для первого значения (передать адрес с помощью &)
    
    // TODO: Вывести после удвоения
    
    // TODO: Использовать tripleByReference для второго значения (передать переменную напрямую)
    
    // TODO: Вывести после утроения
    
    // TODO: Использовать swapValues для обмена обоих значений (передать адреса с помощью &)
    
    // TODO: Вывести после обмена
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C++