为什么我们需要使用(void *)& a而不是& a

时间:2016-02-01 10:18:20

标签: c

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*)?这只是一种习惯吗?

4 个答案:

答案 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函数

     
      
  1. 如果转换规范无效,则行为未定义。 282)如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。
  2.   

由于指向int 的指针与指向void 的指针的类型不同,并且%p可能只用于指向void <的指针/ em>,即使其他一些规则说任何指针都可以转换为指向void 的指针,但由于引用的规则,这并没有改变行为未定义的事实。 / p>