2015-08-06 4 views
1

Почему адрес не меняется, когда я увеличиваю str? Я думал, что когда я выполнил арифметику указателя, указатель указывает на другой адрес памяти. Следовательно, не следует ли менять адрес памяти?Общие сведения о адресах памяти в C++

#include <iostream> 
using namespace std; 

void reverse(char* str){ 
    cout << &str << endl; 

    while(*str != '\0'){ 
     cout << &str << endl; 
     str++; 
    } 
} 


int main(){ 

    char str[] = "hello"; 
    reverse(str); 

} 
+0

Вы печатаете адрес указателя, который хранит адрес - это 'char **' –

+0

Возможно, 'cout << (void *) str << endl;' - это то, что вы ищете –

ответ

5

&str - адрес указателя. Вы меняете указатель, когда вы перебираете символы, но указатель, который вы меняете, все еще находится в одном месте.

Редактировать: смените cout << &str << endl; на cout << "pointer loc<" << &str << "> pointer value<" << (void*)str << ">" << endl; и посмотрите, что он говорит.

+0

@Quentin Хороший момент, я обновлю его – RyanP

+0

Большое вам спасибо за ваш ответ. В этом есть смысл. Я получаю адрес указателя, который указывает на сохраненное значение. Однако что означает (void *) str? Или вы могли бы указать мне на какой-то ресурс, чтобы я мог понять это? – aejhyun

+0

@Jae Это оператор кастинга (на самом деле это кастинг C-стиля, который является чем-то, чего вы обычно не должны делать ... стыдно за меня). Он сообщает компилятору обрабатывать часть данных с определенным типом данных, как если бы у него был другой тип данных. «Void *» в основном является указателем на адрес памяти, где тип данных не определен. До его кастования это были «char *» и «cout», которые бы поняли это и вывели всю строку в этом месте (продолжали выводить, пока не нажмут «\ 0»). Как 'void *' он не будет интерпретировать его таким образом и будет печатать значение по этому адресу памяти. – RyanP

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