Указатели и память

Указатели и адреса

Указатель содержит адрес объекта совместимого типа.

Что такое Указатели и адреса?

Указатель содержит адрес объекта совместимого типа.

Сохраните адрес, разыменуйте его и измените исходный объект.

Важные моменты

  • Указатель ссылается на живой совместимый объект или равен null.
  • Каждое собственное выделение освобождается ровно один раз.
  • Явно выражайте ownership и const.

Примеры кода на C и C++

C
Запустить →
main.c
#include <stdio.h>

int main(void) {
    int score = 70;
    int *score_ptr = &score;
    *score_ptr += 5;
    printf("score=%d same-address=%s\n", score,
           score_ptr == &score ? "yes" : "no");
    return 0;
}
Ожидаемый результат
score=75 same-address=yes
C++
Запустить →
main.cpp
#include <iostream>

int main() {
    int score = 70;
    int* score_ptr = &score;
    *score_ptr += 5;
    std::cout << "score=" << score << " same-address="
              << std::boolalpha << (score_ptr == &score) << '\n';
}
Ожидаемый результат
score=75 same-address=true

Сравнение C и C++

C напрямую использует raw pointer. C++ сохраняет их для non-owning доступа, но предпочитает ссылку, когда null не нужен.

C

Ownership и очистка — соглашения, контролируемые программистом.

C++

Контейнеры и RAII связывают ownership и очистку с lifetime объекта.

Практические задания

Запустите обе версии и изменяйте их, сравнивая гарантии языков.

  • Проверьте null и отказ выделения памяти.
  • Используйте AddressSanitizer и UndefinedBehaviorSanitizer.
  • Документируйте ownership каждого указателя.