为什么C++总是显示十六进制内存地址,而不仅仅是整数?
Why does C++ always display a Hexadecimal memory address and not just an integer?
我想知道为什么在 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++ 中的小数。
相关文章:
- 检查输入是否不是整数或数字
- 为什么这个案例陈述需要一个"if else"而不仅仅是一个"if"?
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- int8_t和uint8_t真的是整数吗?它们有什么用?
- 为什么我们要做"INT_MAX/10"而不仅仅是INT_MAX?
- 为什么 std::vector 需要 is_trivial 才能按位移动,而不仅仅是is_trivially_copya
- 为什么在这个C++问题中使用const_iterator而不仅仅是迭代器?
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 如果要求比较器是严格的总排序,而不仅仅是严格的弱排序,C++标准算法会更快吗?
- 为什么输出是整数而不是双精度?
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 为什么我们必须在 C++ 中释放数组数组,而不仅仅是整个"matrix"
- 浮点到整数转换出错(即使浮点数已经是整数)
- " ans += (a[i] - ans * r > 0); "是什么意思,其中 ans,r 是整数,a[i] 是数组元素?
- 十进制文字不仅仅是LONG_LONG_MAX
- 为什么非放置"新建"和"删除"内置于语言中,而不仅仅是常规函数?
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- G :数键在“]”令牌之前不是整数常数