【发布时间】:2019-07-03 00:44:42
【问题描述】:
char x = 'G';
char *p = &x;
printf ("Address of x: %p\n", p);
printf ("Address of x: %p\n", (void*)p);
谁能告诉我(void*)p 到底是什么意思?我知道它和p一样,因为那也给了我x的地址,但是为什么写成(void*)p?
【问题讨论】:
-
%p说明符要求void*作为参数传递。(void*)p正在将p投射到此类。 -
@paulsm4 恐怕纯标题贡献了。我已经编辑了标题(并撤回了反对票)。一方面,我不知道 %p 需要 void 指针。
-
谢谢你,苏玛。另一个潜在的重复是:printf("%p") and casting to (void *)
-
在我学会用 C 编程的机器上(回到 C 标准还没有出现的时代——在
void *或%p存在之前),如果你打印short s; printf("0x%lX\n", &s); printf("0x%lX\n", (char *)&s);,你会得到不同的结果,因为机器使用了面向字的寻址。与同一对象的char *地址相比,任何“比char更宽”的类型都是如此。这意味着您必须非常小心,以确保在使用malloc()之前声明它,否则一切都会可怕地爆炸。这些天来,它更容易了。 -
@chux: C11 §6.2.5 Types ¶28 说:指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。48) 脚注 48 说:相同的表示和对齐要求意味着作为函数的参数、函数的返回值和联合成员的可互换性。我认为它们在所有情况下都必须是等效的,包括@987654338 @ — 但只是在参数列表的
...部分写入0并不一定会创建指针大小的值;使用演员表。
标签: c