Таким образом, у нас есть назначение в моем классе C++ для создания указателя на символ, а инструкции:
Для каждой декларации необходимо:
Инициализировать указатель на соответствующее значение адреса
Покажите содержимое указателя (сопоставьте это значение с адресом того, что указывает на)
Покажите содержимое указателя (сопоставьте это значение с исходным содержимым)
Всякий раз, когда я пытаюсь отобразить адрес char a with & a, он просто выводит значение, сохраненное в char a, а не на адрес. Когда я пытаюсь сделать это с помощью целых чисел, он работает так, как я хочу.
Может ли кто-нибудь дать мне представление о том, что я делаю неправильно?
#include <iostream>
using namespace std;
int main()
{
// Question 1, Part I
// (a)
char a = 'A';
char * pa = &a;
//(b)
cout << "Address of a = " << &a << endl;
cout << "Contents of pa = " << pa << endl;
//(c)
cout << "Contents of a = "<< a << endl;
cout << "What pa points to = "<< *pa << endl;
return 0;
}
Редактировать и запустить
Когда вы указываете указатель на char для cout, он будет рассматривать его как строку с нулевым завершением c.
Перепишите его в указатель void:
cout << "Address of a = " << static_cast<void*>(&a) << endl;
Стандарт гарантирует, что адрес не изменяется в разделе 4.10/2:
Prvalue типа "указатель на cv T", где T - тип объекта, может быть преобразован в prvalue типа "указатель на cv void". Результат преобразования значения ненулевого указателя указателя на тип объекта на "указатель на cv void" представляет адрес того же байта в памяти, что и исходное значение указателя.
Здесь объяснение о указателе на char в выходных потоках. И здесь объяснение, почему void*
вызывает отображение указателя.
Измените эти утверждения
cout << "Address of a = " << &a << endl;
cout << "Contents of pa = " << pa << endl;
в
cout << "Address of a = " << ( void * )&a << endl;
cout << "Contents of pa = " << ( void * )pa << endl;
или
cout << "Address of a = " << reinterpret_cast<void *>( &a ) << endl;
cout << "Contents of pa = " << reinterpret_cast<void *>( pa ) << endl;
или
cout << "Address of a = " << static_cast<void *>( &a ) << endl;
cout << "Contents of pa = " << static_cast<void *>( pa ) << endl;
Все три варианта будут работать.
void*
.cout
имеет специальную обработку дляchar*
которая печатает строку. Кстати, ваш код демонстрирует неопределенное поведение.