Присвоение адреса целочисленной переменной

Почему вы можете присвоить адрес целочисленной переменной, например, компилятор не выдаст ошибку. я всегда, хотя вы можете назначить только целочисленные значения целочисленной переменной

int a=0x28ff1c

Вы можете сделать то же самое для переменной типа char, компилятор не выдаст ошибку

char b=0x28ff1c

Он выведет на экран консоли мусорное значение для символа b и случайное значение для int a

cout<<b
<<endl;
cout<<a;

Может кто-нибудь объяснить мне, почему есть разница в выводе для char b и int a.
Может кто-нибудь также объяснить мне, почему переменная типа char и целочисленная переменная могут иметь адреса, назначенные ей

5

Решение

Число 0x28ff1c это просто шестнадцатеричное (base-16) представление десятичного (base-10) числа 2686748, Как cout по умолчанию печатается десятичное значение для целых чисел, это, вероятно, число, которое вы напечатали.

Случай с char b = 0x28ff1c немного отличается, потому что

  1. char недостаточно велик, чтобы держать это значение. Практический результат заключается в том, что он усекается до 0x1c,
  2. cout лечит char особенно, потому что он обычно используется для хранения текстовых данных, так cout печатает символ с кодом 0x1c, который является своего рода управляющим персонажем. Вы можете попробовать это с 0x41 например (который представляет 'A' в ASCII и UTF-8).

И обратите внимание, что нет ничего, что отмечает 0x28ff1c в качестве адреса. Адрес будет сформирован &a или же (void*)0x28ff1c,

5

Другие решения

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 это адрес, сам номер не.

8

Потому что в любом буквальном начале 0x на самом деле является целым числом. Так что это разрешено. Адрес является иногда может быть целым числом.

1

Вы также можете использовать *(int *)(Address) = value как конструкция, чтобы назначить value в Address и используйте ответ @Luchian Grigore

0
По вопросам рекламы [email protected]