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

Многомерные массивы

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

Что такое Многомерные массивы?

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

Обходите row-major матрицу и считайте суммы строк.

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

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

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

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

int main(void) {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    for (int row = 0; row < 2; ++row) {
        int total = 0;
        for (int column = 0; column < 3; ++column) total += matrix[row][column];
        printf("row %d=%d\n", row, total);
    }
    return 0;
}
Ожидаемый результат
row 0=6
row 1=15
C++
Запустить →
main.cpp
#include <array>
#include <iostream>

int main() {
    std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
    for (std::size_t row = 0; row < matrix.size(); ++row) {
        int total = 0;
        for (int value : matrix[row]) total += value;
        std::cout << "row " << row << '=' << total << '\n';
    }
}
Ожидаемый результат
row 0=6
row 1=15

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

Функция C должна знать все размеры, кроме первого; std::array хранит размеры в типе и предлагает at.

C

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

C++

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

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

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

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