说你在C中有一个字符数组。像这样:
char array[];
现在,下面的哪个陈述将打印出地址。我知道1)和2)会,但3)也打印出地址吗?
1) printf("Arrays adress is %x\n", array);
2) printf("Arrays adress is %x\n", &array[0]);
3) printf("Arrays adress is %x\n", &array);
答案 0 :(得分:6)
他们都不是。所有这些都会打印垃圾值,即你的程序的行为未定义
编辑:由于OP现在改变了他的问题,答案是:
所有人都会使用%p
说明符打印地址,并将array
,&array
和&array[0]
分别投放到void *
。
char array[5]; //let's assume an array of 5 chars
printf("Arrays adress is %p\n", (void *)array);
printf("Arrays adress is %p\n", (void *)&array[0]);
printf("Arrays adress is %p\n", (void *)&array);
答案 1 :(得分:2)
假设array
应阅读text
且声明为,您将使用char text[] ="...something ..."
%p
代替%x
并传递了传递给void*
的值:是的,会打印一些地址。
答案 2 :(得分:1)
不是真的,如果你想打印出内存地址(指针值),我会使用正确的格式:
printf("The address is: %p\n", &array);
例如,%x
将只打印 int 作为相应参数传递的十六进制值。完成后,所有三个语句都打印出完全相同的内容:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char foo[] = "Some string";
printf("%p\n%p\n%p\n", (void *)foo, (void *)&foo, (void *)&foo[0]);
return 0;
}
打印出同样的东西,三次 正如H2CO3指出的那样,你需要转换为printf的void指针,尽管
通常,数组计算其第一个元素的地址。这就是为什么array
,&array
和&array[0]
都会生成相同的值。 You can read all about it here