int main()
{
int a;
int* b;
a = 40;
b = &a;
printf("the address of a is %p, and the value of a is %d \n",&a, a);
return 0;
}
我发现(void*)&a
和&a
都打印相同的内容。那么为什么人们仍然会添加(void*)
?这只是一种习惯吗?
答案 0 :(得分:5)
使用说明符%p
打印存储在指针中的地址,此格式说明符要求类型为void *
。由于&a
的类型为int *
,因此会使用强制转换void *
。
答案 1 :(得分:2)
printf()
格式说明符%p
需要void*
类型指针。由于您传递的内容可能不是void*
类型指针,并且标准并未强制要求所有指针具有相同的格式,因此在将指针传递给void*
之前将其指向int* a = malloc(sizeof(int));
printf("a is %p",(void*)a);
是很重要的。 printf的。
例如:
int*
最佳做法是void*
和accountInfoText.AppendText(addInfo);
File.AppendAllText("Z:/Daniel/AccountInfo/" + lastNameInfoBox.Text + "_" + firstNameInfoBox.Text + ".txt", accountInfoText.Text);
不相似
答案 2 :(得分:1)
首先,不同的指针类型不一定是可互换的。
其次,对于varargs,没有发生隐式转换,因为编译器不知道期望的类型。
答案 3 :(得分:1)
C Standard表示在printf中对参数使用不正确的说明符将导致未定义的行为。
7.21.6.1 fprintf函数
- 如果转换规范无效,则行为未定义。 282)如果有任何论据 不是相应转换规范的正确类型,行为是 未定义。
醇>
由于指向int 的指针与指向void 的指针的类型不同,并且%p
可能只用于指向void <的指针/ em>,即使其他一些规则说任何指针都可以转换为指向void 的指针,但由于引用的规则,这并没有改变行为未定义的事实。 / p>