Итерация по массиву в стиле C без использования указателя
Я изучаю арифметику указателей, и у меня есть кусок кода, который дает мне ошибку в течение довольно долгого времени. любая помощь будет оценена.(Я не мог найти ее на SO)
int arr [] = {1, 2, 3, 4, 5} ;
for (int i = 0 ; i < 5 ; i++)
{
cout << *arr ;
arr++ ;
}
cout << *arr << endl ;
Я не могу понять, какую ошибку я получаю в кодовых блоках. Я получаю это заявление.
error: lvalue required as increment operand|
||=== Build finished: 1 errors, 0 warnings ===|
В этом коде я должен перебрать массив без разыменования или использования []
оператор.
2 ответа
Вы получаете эту ошибку, когда пытаетесь увеличить массив. Это неверно, потому что в C++ имя массива может быть неявно преобразовано в постоянный указатель на самый первый индекс. Вы не можете увеличивать массив, потому что массив является контейнером, и увеличение контейнера не имеет смысла.
Чтобы полностью ответить на ваш вопрос, мне нужно объяснить некоторые вещи. Позвольте мне попробовать, и другие могут добавить.
Помните, что есть три типа постоянных указателей.
1. Указатель на постоянную ячейку памяти. Это обычный указатель, но он указывает на переменную, которая по своей природе является постоянной (переменная только для чтения). Это означает, что значение переменной, на которую он указывает, не может быть изменено через нее. Обычно используется точка постоянная переменная, как это.
const int x = 10 ;
const int *ptr = & x ;
здесь вы не можете сделать *ptr = 5 ;
потому что указатель указывает на постоянную переменную.
2.Const указатель на ячейку памяти. Это указатель, который может указывать только на одну ячейку памяти во всей программе. Значение переменной, на которую он указывает, может быть изменено, но сам указатель является постоянным. Объявлено так.
int x = 10, y = 5 ;
int * const ptr = &x ;
ты не можешь сделать ptr = &y ;
позже в программе. Массив также может быть неявно преобразован в постоянный указатель на область памяти. Таким образом, он не может быть увеличен или уменьшен таким образом. (Вы можете прочитать об этом здесь, если хотите: Что такое распадающийся массив?)
3. Постоянный указатель на постоянную ячейку памяти. Это указатель, который сам является константой и также указывает на постоянную ячейку памяти. это объявлено как это.
const int x = 8 ;
const int * const ptr = &x ;
Это означает, что вы также не можете указывать указатель в любое место, кроме инициализированного местоположения, и вы даже не можете изменить значение местоположения, на которое оно указывает.
Я надеюсь, что концепция уже очень ясна. Теперь к вашему вопросу: вы хотите напечатать массив с помощью арифметики с указателями, но вы не можете увеличивать сам массив. Поэтому одним из решений для этого является создание другого указателя (обычного) и присвоение ему адреса первого индекса массива. Затем вы можете увеличить, уменьшить или изменить значение этого массива. Что-то вроде этого.
int arr [] = {1, 2, 3, 4, 5} ;
int *ptr = arr ;
for (int i = 0 ; i < 5 ; i++)
{
cout << *ptr << " " ;
ptr++ ;
}
Так что вы всегда можете сделать:
int arr [] = {1, 2, 3, 4, 5} ;
int *a = arr;
for (int i = 0 ; i < 5 ; i++)
{
cout << *a ;
a++ ;
}