将地址分配给整数变量

Com*_*erd 5 c++ variables memory-address

为什么你可以为这样的整数变量分配地址,编译器不会给出错误.我总是只能将整数值分配给整数变量

int a=0x28ff1c
Run Code Online (Sandbox Code Playgroud)

您可以对char变量执行相同操作,编译器不会给出错误

char b=0x28ff1c
Run Code Online (Sandbox Code Playgroud)

它将在控制台屏幕上输出char b的垃圾值和int a的随机值

cout<<b
    <<endl;
cout<<a;
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么char b和int a的输出存在差异.有人可以向我解释为什么char变量和整数变量可以分配地址

Luc*_*ore 8

0x28ff1c 不是地址本身 - 它只是一个十六进制数.

以下是等效的:

int a =   2686748;  //decimal number
int a =  0x28ff1c;  //hexadecimal number
int a = 012177434;  //octal number
Run Code Online (Sandbox Code Playgroud)

地址由指针表示 - 如果它只是一个地址,你可以使用void*:

void* p = (void*)0x28ff1c;
Run Code Online (Sandbox Code Playgroud)

在这种情况下

int a = p;
Run Code Online (Sandbox Code Playgroud)

不会编译.p是一个地址,数字本身不是.


Bar*_*nau 5

该数字0x28ff1c只是十进制(base-10)数字的十六进制(base-16)表示2686748.至于cout默认为整数打印十进制值,这可能是你得到的印刷数量.

案例char b = 0x28ff1c略有不同,因为

  1. char不足以保持这个价值.实际结果是它被截断为0x1c.
  2. coutchar特别对待,因为它通常用于保存文本数据,所以cout打印出具有代码的字符0x1c,这是某种控制字符.你可以试试它0x41(例如'A'用ASCII和UTF-8表示).

请注意,没有任何标记0x28ff1c为地址.地址将由&a或形成(void*)0x28ff1c.