В 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