如何在C中使用内存地址?它们是十六进制还是无符号整数?

Ani*_*nna -2 c c++ memory pointers unsigned-integer

我正在学习C,最近我的课程指针和内存地址.老师告诉我们,内存位置基本上是无符号数字,因此我们可以使用以下代码显示它们:

int a;
printf("%u", &a);
Run Code Online (Sandbox Code Playgroud)

要么

int a, *p=&a;
printf("%u", p);
Run Code Online (Sandbox Code Playgroud)

事实上,这是有效的,但我也在一些论坛中读到,应该使用%p或%x来打印地址.所以,它们必须是十六进制数...我上面看到的整数实际上是十六进制数转换为十进制吗?实际上它们的基本形式是什么地址 - 十六进制或整数或简单的二进制数.

请帮帮我.

pax*_*blo 5

基本形式的地址只是值.十六进制,二进制或八进制是数字的表示.例如42,0x2a,,,,和都是不同的表示相同的值.2a1605252810101021042

就你应该用作格式字符串而言,%p是正确的.无法保证无符号整数与指针具有相同的位数,因此您可能会丢失信息.

实际上,提供和参数printf与相应的格式说明符不匹配实际上是未定义的行为.

使用%u%x变体可能适用于大多数系统,其中指针和无符号整数具有兼容的大小,但真正的可移植代码不依赖于此.例如,一个实现可以自由地拥有一个16位无符号整数(以满足最小范围要求ISO C11 Appendix E)和一个1024位指针类型(我得给我一台这样的机器).