2016-12-11 6 views
-1

У меня есть структура C++, которая имеет динамически выделенный массив в качестве указателя. У меня есть функция для изменения массива, но он не работает (я думаю, это потому, что временная переменная указывает на исходное значение).Указатель элемента разыменования

struct s { 

    int *array; 
    int length; 

    ... 

    s(int n) { 
     this->array = new int[n]; 
     this->length = n; 
    } 

    ... 

    void reverse() { 

     for (int i = 0; i < this->length; i++) { 
      int n = this->array[i]; 
      this->array[i] = this->array[this->length - i - 1]; 
      this->array[this->length - i - 1] = n; 
     } 

    } 

    ... 

} 

Я думаю, что это делает, this->array[this->length - i - 1] = this->array[i] Поэтому массив остается неизменным и не получает обратный. Я не знаю, как относиться к указателю массива или как просто принимать значение this->array[i] в n.

+0

вы логика делает двойной обратный. Для i = 0 вы поставили массив [n-1] в array [0], при i = n-1 вы кладете массив [0] в массив [n-1]. –

+0

Я думаю, что первая часть цикла for сделает первую половину массива правильной, но затем сделает зеркальное изображение первой половины во второй половине. Для простоты кода, почему бы просто не использовать массив указателей, обратившись ко второму массиву, а затем переустановить указатель? –

+0

Рекомендуем прочитать [Что такое правило 3?] (Http://stackoverflow.com/questions/4172722/what-is-the-ru-of-three), поскольку это может предотвратить несколько будущих вопросов. – user4581301

ответ

4

Причина, по которой ваш реверс не работает, заключается в том, что вы проходите всю длину массива. Вам нужно пройти только половину. Если вы пройдете вторую половину, вы не измените ее.

В качестве примера, если вы пытаетесь отменить [1, 2, 3, 4] вы получите

after i = 0: [4, 2, 3, 1] 
after i = 1: [4, 3, 2, 1] 
--- reversed --- 
after i = 2: [4, 2, 3, 1] 
after i = 3: [1, 2, 3, 4] 
--- back to original --- 

Вместо этого, просто сделать свой цикл

for (int i = 0; i < this->length/2; i++) { 
    ... 
} 
+0

Да, спасибо, сейчас работает. – KSL

0

На стороне записки, используя 2 шагового упростит ваш код значительно:

void reverse() 
{ 
    int limit = length/2; 
    for (int front = 0 , back = length - 1; front < limit; front++ , back--) 
    { 
     int n = array[front]; 
     array[front] = array[back]; 
     array[back] = n; 
    } 

} 

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

  • Нет связанных вопросов^_^