"jesus"
首先,为什么是&"jesus"
相同的:"jesus"
是一个类型的数组const char[6]
,它衰减为指向第一个元素的指针。获取数组的地址会给你一个指向数组的指针,它的类型是const char (*)[6]
。但是,指向数组的指针在数值上与指向其第一个元素的指针相同(只是类型不同)。
这也解释了为什么最后一行有错误 - 类型类型错误。你需要:
const char (*pj)[6] = &"jesus";
最后,问题是重复的字符串文字是否具有相同的地址。这完全取决于编译器。如果它非常幼稚,它可以为源代码中每次出现的字符串文字存储一个单独的副本。如果它稍微聪明一点,它只会为每个字符串文字存储一个唯一的副本。字符串文字当然存储在内存中的某个地方,通常存储在程序映像的只读数据段中。将它们视为静态初始化的全局变量。
还有一件事:您的原始代码实际上是undefined behavior,因为%p
需要一个void *
参数,而不是 aconst char *
或 a const char (*)[6]
。所以正确的代码是:
printf("%p\n%p\n", (void const *)"jesus", (void const *)&"jesus");