В C++ массивы и указатели тесно связаны. Это связано с тем, что имя массива в выражении (за исключением случаев, когда оно используется с оператором & или в качестве операнда sizeof или decltype) неявно преобразуется в указатель на его первый элемент. Рассмотрим подробнее эту связь:

Имена массивов и указатели

Имя массива в большинстве контекстов преобразуется в указатель на первый элемент массива. Например:

int arr[10];
int *ptr = arr; // ptr указывает на первый элемент массива arr

Индексация массива через указатели

Индексация массива эквивалентна арифметике указателей. Например:

int arr[10];
int *ptr = arr;
arr[2] == *(ptr + 2); // true

Оба выражения, arr[2] и *(ptr + 2), ссылаются на третий элемент массива.

Арифметика указателей

С указателями можно выполнять арифметические операции, такие как сложение и вычитание, что позволяет перемещаться по элементам массива:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
ptr += 2; // теперь ptr указывает на arr[2]
std::cout << *ptr; // выводит 3

Передача массивов в функции

В C++ массивы нельзя передавать в функции по значению. Однако можно передать указатель на первый элемент массива, что выглядит как передача массива:

void printArray(int *array, int size) {
    for (int i = 0; i < size; i++) {
        std::cout << array[i] << " ";
    }
}
 
int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    printArray(arr, 5);
    return 0;
}

Массивы указателей и указатели на массивы

В C++ можно создавать массивы указателей и указатели на массивы:

int *ptrs[10]; // массив из 10 указателей на int
int (*ptrToArray)[10]; // указатель на массив из 10 элементов типа int
int arr[10];
int (*ptrToArray)[10] = &arr; // ptrToArray указывает на весь массив arr