Почему вы можете присвоить адрес целочисленной переменной, например, компилятор не выдаст ошибку. я всегда, хотя вы можете назначить только целочисленные значения целочисленной переменной
int a=0x28ff1c
Вы можете сделать то же самое для переменной типа char, компилятор не выдаст ошибку
char b=0x28ff1c
Он выведет на экран консоли мусорное значение для символа b и случайное значение для int a
cout<<b
<<endl;
cout<<a;
Может кто-нибудь объяснить мне, почему есть разница в выводе для char b и int a.
Может кто-нибудь также объяснить мне, почему переменная типа char и целочисленная переменная могут иметь адреса, назначенные ей
Число 0x28ff1c
это просто шестнадцатеричное (base-16) представление десятичного (base-10) числа 2686748
, Как cout
по умолчанию печатается десятичное значение для целых чисел, это, вероятно, число, которое вы напечатали.
Случай с char b = 0x28ff1c
немного отличается, потому что
char
недостаточно велик, чтобы держать это значение. Практический результат заключается в том, что он усекается до 0x1c
,cout
лечит char
особенно, потому что он обычно используется для хранения текстовых данных, так cout
печатает символ с кодом 0x1c
, который является своего рода управляющим персонажем. Вы можете попробовать это с 0x41
например (который представляет 'A'
в ASCII и UTF-8).И обратите внимание, что нет ничего, что отмечает 0x28ff1c
в качестве адреса. Адрес будет сформирован &a
или же (void*)0x28ff1c
,
0x28ff1c
это не сам адрес — это просто шестнадцатеричное число.
Следующее эквивалентно:
int a = 2686748; //decimal number
int a = 0x28ff1c; //hexadecimal number
int a = 012177434; //octal number
Адрес представлен указателем — если это просто адрес, вы можете использовать void*
:
void* p = (void*)0x28ff1c;
В таком случае
int a = p;
не будет компилироваться p
это адрес, сам номер не.
Потому что в любом буквальном начале 0x на самом деле является целым числом. Так что это разрешено. Адрес является иногда может быть целым числом.
Вы также можете использовать *(int *)(Address) = value
как конструкция, чтобы назначить value
в Address
и используйте ответ @Luchian Grigore