@Web__Devel

Почему в C++ указатели так себя ведут?

Всем привет. Сейчас изучаю тему использования указателей в C++, чтобы впоследствии для меня был понятен механизм их работы при любой сложности их использования. В данном случае хочу задать вопросы прямо в коде, в котором я экспериментировал с указателем на значение int:
int *aaa;
    aaa = new int(6);
    qInfo() << aaa;       // 0x6a4e50   <- узнать адрес значения
    qInfo() << *aaa;      // 6          <- посмотреть значение что находится по этому адресу
    qInfo() << &aaa;      // 0x28fbe8   <- ?? а это что за адрес? адрес по которому лежит адрес значения?
    qInfo() << &*aaa;     // 0x6a4e50   <- снова адрес значения? (разыменование -> значение -> ..дальше не понимаю..)
    qInfo() << *&aaa;     // 0x6a4e50   <- теперь вообще непонятно
    qInfo() << *&*&*aaa;  // 6          <- каким-то чудом достаем от туда значение, но как?

Если у вас есть еще всякие интересные примеры, то покажите? (функции пока не надо, еще не дошел)
  • Вопрос задан
  • 613 просмотров
Решения вопроса 1
15432
@15432
Системный программист ^_^
int *aaa; //переменная с именем aaa типа "указатель на int", расположена в некоторой ячейке памяти, выделенной на стеке
    aaa = new int(6);  //присваиваем переменной aaa новое значение, а именно, адрес выделенной ячейки памяти в куче, содержащей значение 6
    qInfo() << aaa;       // 0x6a4e50   <- узнать тот самый адрес, что мы присвоили указателю
    qInfo() << *aaa;      // 6          <- перейти по этому адресу и извлечь значение 
    qInfo() << &aaa;      // 0x28fbe8   <- адрес ячейки, где лежит значение самой переменной aaa
    qInfo() << &*aaa;     // 0x6a4e50   <- перешли по указателю, который лежит в aaa (ячейка в куче, содержащая значение 6), потом узнали адрес этой ячейки, и конечно это тот самый адрес, по которому мы перешли
    qInfo() << *&aaa;     // 0x6a4e50   <- узнали адрес ячейки стека, по которому расположена переменная aaa, потом перешли по нему и извлекли значение переменной aaa. то же самое, что и просто обратиться к aaa
    qInfo() << *&*&*aaa;  // 6 тож самое что и выше, все &* нивелируют друг друга (переход по адресу и опять получение того же самого адреса обратно), остаётся только *aaa, ну а там лежит 6
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Diel
@Diel
Стоить помнить, что сам указатель тоже переменная, тоже храниться в памяти, а по этому на него тоже будет указатель. Так что &aaa покажет вам где на стеке находится ааа.
А если делать &*aaa или *&ааа то & и * по сути просто компенсируют друг друга. Взять адрес и взять значение по адресу или же наоборот равносильно тому, чтобы ничего не сделать. По этому aaa == &*aaa == *&aaa, в то время как *a == *&*&*aaa == *&*&*&*&*&*&*aaa. Сам тоже не сильно шарю, но тут вроде понятно))
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Ваши примеры работы с указателями не сильно интересны - вы рассматриваете только 2 простейшие операции, причем 4 и последующие примеры явно искусственные, в реальности вы вряд ли такое встретите.

Рассмотрите лучше работу с массивами через указатели.
Сначала одномерные массивы, потом перейдите к двумерным и трехмерным. Заодно поймете работу адресной арифметики.
Так же стоит освоить передачу одномерных и n-мерных массивов как параметры в функции, это то же часто вызывает вопросы.
Еще интересный вариант - массив массивов (это типа двумерного массива, только организуется как массив указателей).
Еще есть интересные варианты использования указателей из области драйверописания - типа нескольких вариантов записи/чтения области памяти адрес которой известен. Придумайте 2-3 варианта. Но это довольно просто, на практике хватает одного варианта :-) но знать альтернативы, как минимум не плохо.
Так же освойте работу с константными указателями, указателями на константу и константными указателями на константу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы