我们能打印出字符串文字的地址吗?

我做了谷歌,我意识到有人说它可以说它不能。

我想validation一下。

例如

char gchararr1i[] = "testing 123"; // global char array init char *gptr1i = "hello", *gptr2ui; // global char pointer init and un-init float gfloati = 123.4; // global float var init double gdoubleui; // global double var un-int int main(int argc, char *argv[]) { printf("\n Address of string literals \"testing 123\" = %p and \"hello\" = %p \n", gchararr1i, gptr1i);// output the addresses of string literals "testing 123" and "hello" f1(10, -20, 30.3, 'A', 45.67); exit(0); } 

您可以获取字符串文字的地址,但不能确定具有完全相同内容的两个字符串文字将位于同一地址(或者它们将不具有相同的地址)。 在这方面,编译器工具链可以自由地进行。

该标准甚至允许一个字符串文字与另一个字符串共享内存。 例如, "world"的地址可能“指向”文字"hello world" 。 我不知道这样做的实现,但我也没有检查过它。

我们能打印出字符串文字的地址吗?

是。 打印字符串文字地址的简单示例。

 printf("%p\n", (void *) "Hello Word!"); 

产量

 0x100403055 

以下打印出gchararr1i[]的第一个元素的地址。 这可能是也可能不是字符串文字的地址。 字符串文字甚至可能不在代码中单独存在。

 char gchararr1i[] = "testing 123"; printf("%p\n", (void *) gchararr1i); 

产量

 0x22caa0 

下面打印出指针gptr1i的地址值,它恰好是字符串文字"hello"的地址。

 char *gptr1i = "hello"; printf("%p\n", (void *) gptr1i); 

产量

 0x100403060 

细节: "%p仅用打印void*指针定义。当打印除void*之外的对象指针时,首先转换为void * 。 @ user3386109 。注意:打印函数指针请看这个 。

 int x; // printf("%p\n", x); printf("%p\n", (void *)&x);