我读到当你使用指针声明字符串时,指针包含字符串文字的内存地址。因此我希望从这段代码中获取内存地址,而是我得到一些随机数。请帮助我理解为什么它不起作用。
int main()
{
char *hi = "Greeting!";
printf("%p",hi);
return(0);
}
如果指针hi
包含字符串文字的内存地址,那为什么它不显示内存地址?
答案 0 :(得分:1)
确实有效。只是你可以认为地址是由C运行时任意选择的。 hi
是一个指针,设置为字符串中大写G
的地址。您拥有hi
之内的所有内存,包括该字符串末尾的nul-terminator。
另外,使用const char *hi = "Greeting!";
而不是char *
:从hi
开始的内存是只读。不要尝试修改字符串:尝试这样做的行为是 undefined 。
答案 1 :(得分:0)
"随机数"你得到的是内存地址。它们不是常量,因为在每次执行程序时,都会使用其他内存地址。
答案 2 :(得分:0)
指针可以用几种方式表示。格式字符串"%p"
"写入定义指针" link的实现定义字符序列。在大多数情况下,它将指向对象的地址解释为一个适当大小的无符号整数,看起来像是一堆随机数"。
用户可读指针表示通常仅用于调试。它允许你比较两个不同的表示(指针是否相同?),在某些情况下,指针之间的相对顺序和距离(指针来自"第一个",它们相隔多远?) 。将指针解释为整数在这种视觉中很有效。
如果您能说明您期望的输出,那将对我们有所帮助。也许你期望指针从零开始?
请注意,虽然某些编译器可能会接受您的示例,但使用const char *
会更明智。使用char *
将允许您尝试修改字符串文字,这是未定义的行为。