Вы абсолютно правы, ваш код не работает так, как вы ожидаете. Проблема в том, что вы пытаетесь получить доступ к памяти, которая не предназначена для хранения целого числа.
Объяснение:
int* pa = &a;: Создает указатель pa, который хранит адрес переменной a.
int* pa1 = (int*)&pa;: Создает указатель pa1, который хранит адрес переменной pa. Важно: Этот код делает неявное преобразование типа, что является опасным и может привести к ошибкам. Вы пытаетесь представить адрес указателя pa как адрес целого числа.
Ошибка:
Вы пытаетесь считать 4 байта памяти по адресу &pa как целое число. Однако эта память содержит не данные типа int, а адрес pa, который не является целым числом. Поэтому вы получаете неправильное значение, которое может быть любым.
Правильный способ:
Чтобы получить значение pa через pa1, вам нужно использовать оператор разыменования (*) для pa1:
#include
using namespace std;
int main()
{
int a = 5;
int* pa = &a;
int** pa1 = &pa; // Правильный способ объявления указателя на указатель
cout << "a: " << a << "\t" << "&a: " << &a << endl;
cout << "pa: " << pa << "\t" << "&pa: " << &pa << "\t" << "*pa: " << *pa << endl;
cout << "pa1: " << pa1 << "\t" << "&pa1: " << &pa1 << "\t" << "*pa1: " << *pa1 << endl; // Теперь *pa1 - это значение pa
cout << "**pa1: " << **pa1 << endl; // Разменовываем pa1, чтобы получить значение *pa (т.е. значение a)
return 0;
}
Объяснение изменений:
int** pa1 = &pa;: Правильный способ объявления указателя на указатель, теперь pa1 хранит адрес pa.
*pa1: Теперь, после разыменования pa1 мы получаем значение pa, которое является адресом a.
**pa1: Разменовывая pa1 второй раз, мы получаем значение, хранящееся по адресу, на который указывает pa (то есть значение a).
Важные моменты:
Преобразования типов: Избегайте неявных преобразований типов, таких как (int*)&pa, используйте явные преобразования только тогда, когда вы абсолютно уверены, что это необходимо.
Указатели на указатели: Указатели на указатели используются для работы со сложными структурами данных, например, с списками и деревьями.
Память: Важно помнить, что память ограничена, и некорректное использование указателей может привести к ошибкам доступа к памяти и проблемам с безопасностью.
Надеюсь, это пояснение прояснило ситуацию!
Следующий код: Выводит следующее: Вопрос такой, почему *pa1 равно 1118827908?
Разве *pa1 не должно считать 4 байта 0x00 0x00 0x00 0x0F из адреса &pa и интерпретировать их как int? Потому что в таком случае получается, что это должно быть число 251658240.
Что пошло не так?