我做了谷歌,我意识到有人说它可以 有人说它不能。
我想验证一下。
例如
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);
}
答案 0 :(得分:7)
您可以获取字符串文字的地址,但您无法确定具有完全相同内容的两个字符串文字将位于同一地址(或者他们不会拥有相同的地址)。在这方面,编译器工具链可以自由地进行。
标准甚至允许一个字符串文字与另一个字符串共享内存。例如,"world"
的地址可能会指向'文字"hello world"
。我不知道这样做的实现,但我也没有检查过它。
答案 1 :(得分:4)
我们能打印出字符串文字的地址吗?
是。打印字符串文字地址的简单示例。
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。注意:要打印函数指针,请参阅this。
int x;
// printf("%p\n", x);
printf("%p\n", (void *)&x);