为什么C++总是显示十六进制内存地址,而不仅仅是整数?

Why does C++ always display a Hexadecimal memory address and not just an integer?

本文关键字:不仅仅是 整数 地址 内存 C++ 显示 十六进制 为什么      更新时间:2023-10-16

我想知道为什么在 c 中打印变量的地址会给出类似于 823759733 同时,在 C++ 中执行相同的操作表明0x7ff6474009c?? 这是"cout"的工作,将地址格式化为十六进制吗?还是隐藏了可变内存地址以显示一些任意地址来封装它? 我知道C++的虚拟内存中一切都在发生,C 也是如此吗?

例-

int a=10;
int* ptr=&a;
printf("%d", ptr);

它应该打印一个整数。

用 C++ 编写的相同代码 和

cout<<ptr

它显示一个十六进制(我想知道为什么?

我猜你在 C 中打印的东西是这样的:

void* p;
...
printf("%d", p);

%d说明符打印为整数,输出为基数 10。

我想在C++中,你正在做这样的事情:

void* p;
...
std::cout << p;

在这里,由于C++强类型,cout知道p是一个指针,而不是一个整数。默认情况下,指针以 16 为基数输出。

这就是问题所在

printf("%d", ptr);

结果可能是完全错误的。在我的系统上,一个int有 4 个字节,一个指针有 8 个字节。当我尝试将指针打印为十进制(%d(时,它会导致未定义的行为。在我的示例中,我将未定义的行为视为溢出。您应该使用%p打印指针

printf("%p", ptr);

编译器应向您显示警告,例如

warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]

一个例子

#include <stdio.h>
int main() {
int a;
int* ptr = &a;
printf("%d", ptr);
}

编译输出:

prog.c: In function 'main':
prog.c:5:14: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]
5 |     printf("%d", ptr);
|             ~^   ~~~
|              |   |
|              int int *
|             %ls

运行时输出:

-204940372

C 中printf格式说明符的作用由 C++ 中operator<<的不同重载承担。在 C 代码中,您没有显示明确要求打印十进制表示形式,当您调用std::cout::operator<<时,选择了适当的重载。将内存地址打印为十六进制是常见的惯例。如果您愿意,可以将它们打印为 C 和 C++ 中的小数。

相关文章: