Я играл со структурами и указателями, когда наблюдал странное поведение. В следующем коде я создал структуру, содержащую: id, last_name_inital, full_name и first_name_inital. Глядя на адреса памяти int и строки, отлично работает, но при просмотре символов получается сломанный вывод. Я добавил к символам вне структуры, которые показывают одинаковое поведение. Глядя только на вывод символа, и его вывод указателя возвращает тот же символ, что и адрес.Поведение странного указателя с символами
#include <iostream>
#include <string>
using namespace std;
struct entry
{
int id = 1;
char last_name_inital = 'S';
string full_name = "August Smith";
char first_name_inital = 'A';
};
int main()
{
entry aug;
entry *p_aug = &aug;
char alpha ='A';
char *p_alpha = α
char sirra ='S';
char *p_sirra = &sirra;
cout << "Printing structure address" << endl;
cout << p_aug << endl;
cout << "\n";
cout << "Printing id and it's address" << endl;
cout << p_aug->id << " " << aug.id << endl;
cout << &p_aug->id << " " << &aug.id << endl;
cout << "\n";
cout << "Printing last_name_inital and it's address" << endl;
cout << p_aug->last_name_inital <<" "<< aug.last_name_inital << endl;
cout <<&p_aug->last_name_inital<<" "<< &aug.last_name_inital << endl;
cout << "\n";
cout << "Printing full_name and it's address" << endl;
cout << p_aug->full_name << " " << aug.full_name << endl;
cout << &p_aug->full_name << " " << &aug.full_name << endl;
cout << "\n";
cout << "Printing first_name_inital and it's address" << endl;
cout << p_aug->first_name_inital <<" "<<aug.first_name_inital<< endl;
cout <<&p_aug->first_name_inital<<" "<<&aug.first_name_inital<< endl;
cout << "\n";
cout << "Printing alpha and it's address" << endl;
cout << *p_alpha << " " << alpha << endl;
cout << p_alpha << " " << &alpha << endl;
cout << "\n";
cout << "Printing sirra and it's address" << endl;
cout << *p_sirra << " " << sirra << endl;
cout << p_sirra << " " << &sirra << endl;
cout << "\n";
}
, который дает следующий результат (составитель и написана с Geany, г ++, Linux):
структура печати адрес
0x7fff01772360
Печать идентификатора и его адрес
0x7fff01772360 0x7fff01772360
Печать full_name и его адрес
S S
S S
Печать last_name_inital и его адрес
августа Смит августа Смит
0x7fff01772368 0x7fff01772368
Печать last_name_inital и его адрес
AA
A @ A @
Печать альфа и его адрес
А.А.
AS
#w� AS
#WПечать альфа и его адрес
S S
S
#w� S
#W
на каждом запуске последние изменения выходных, так что, очевидно, что-то меняется. Он-лайн поиск дал только этот вопрос, который касается одного и того же фона, но на самом деле, или я его не понимаю. character pointers in C++
В основном, мои основные вопросы - это то, что происходит там, и можно ли выводить указатель на символ, поэтому, где он хранится?
Спасибо
EDIT:
Быстрые ответы решить вопрос о том, как распечатать указатель адреса полукокса. При использовании: (void*)(&char_name)
Однако мне не интересно, почему значения обычных символов изменяются, но значения символов внутри структуры остаются неизменными при повторном запуске. Особенно потому, что поведение для char 'S'
в структуре с cout
является упомянутым оператором-overloaded-just-give-back-the-char, но не для 'A'
, а также не для обычных символов вне структуры.
Может ли кто-нибудь объяснить эти различия? Или даже это не происходит для вас?
Вы не определяете sirra и p_sirra, а в цитируемой выходной строке завершается упаковка, а текст не соответствует коду. Пожалуйста, будьте внимательны при цитировании. –
@LorenzoGatti отредактировал – Marius
Если вы еще раз играли с символами. Из структур, классов и нормалей и вывода '& a_char' с очень своеобразным, неожиданным выходом. Кажется, он считывает все персонажи, которые он находит, даже после первоначального, и даже если они больше не являются символами, что создает странный результат. Любое объяснение приветствуется. – Marius