2015-08-05 17 views
-5

Мне нужна помощь, пытаясь понять, почему мой указательный массив не работает. Я увеличиваю адрес указателя и меня. Мои консольные окна просто висят.Что случилось с моей арифметикой указателя?

int *arr = new int[10]; 
int i = 0; 

while (i < 10){ 
    *arr = i; // assign the value of arr to i 
    arr++;  // increment the pointer by 1 
    i++;  // increment i 
} 

delete[] arr; 
+3

Что _ "не работает" _ на самом деле? Этот фрагмент кода выглядит отлично. Вероятно, ваша ошибка в другом месте. –

+1

Возможно, действительно очевидно, но вы удаляете значения arr с помощью delete. В противном случае код в порядке. –

+1

Используйте отладчик и объясните, что не работает. –

ответ

6

В этой декларации

int *arr = new int[10]; 

указатель обр инициализируется адрес первого элемента массива динамически распределяемой.

В то время цикла

указатель увеличивается на единицу.

arr++; 

Таким образом, после цикла он указует за пределами выделенного массива и этого заявлением

delete[] arr; 

неправильно, потому что указатель arr теперь не хранить оригинальные на Адресные выделенном массиве.

Я думаю, что вы имеете в виду следующее

const int N = 10; 
int *arr = new int[N]; 

int i = 0; 
for (int *p = arr; p != arr + N; ++p){ 
    *p = i++; // assign the value of i to *p 
} 

for (int *p = arr; p != arr + N; ++p) std::cout << *p << ' '; 
std::cout << std::endl; 

delete[] arr; 
+0

Итак, если я это сделаю: int * p = arr; delete p; что должно работать? – runners3431

+0

no delete arr в конце. p - рабочий указатель. –

+0

'delete p' не будет работать. Оператор 'delete' ожидает указатель на первое (исходное) местоположение. –

Смежные вопросы