将指针传递给对象时类型转换为(void *)

时间:2019-01-16 19:37:14

标签: c pointers types casting void-pointers

请考虑以下代码段:

void my_func(int a, void *b);
...

struct my_struct s = { };
my_func(10, (void *)&s);

在将(void *)传递给函数时是否有必要向&s进行类型转换?

3 个答案:

答案 0 :(得分:4)

任何类型的指针都可以在不强制转换的情况下自由地与void *进行转换。

C standard的第6.3.2.3p1节规定:

  

指向void的指针可以与任何对象的指针进行转换   类型。指向任何对象类型的指针都可以转换为   指向void并再次返回的指针;结果应相等   指向原始指针。

唯一需要进行强制转换的情况是,如果您传递一个指向可变参数的指针,例如printf,则该函数不会发生隐式转换,因为它不知道所传递的确切类型是什么。

请注意,与任何指针类型一样,在不进行强制转换的情况下传递给函数时,不能“删除”诸如const之类的限定符。 6.3.2.3p2节规定:

  

对于任何限定词 q ,指向非 q 限定类型的指针都可以转换为指向 q 限定类型的指针类型的版本;存储在原始指针和转换指针中的值应比较相等。

答案 1 :(得分:2)

您不必例外,如果传递给函数的引用的对象是volatileconst-通常具有不同的属性,则可能会收到警告。

void ee(void *q)
{
    pritntf("%p", q);
}

volatile int g;
const int f;

int main()
{

    ee(&g);
    ee(&f);
}

给出以下警告:

<source>: In function 'main':

<source>:17:8: warning: passing argument 1 of 'ee' discards 'volatile' qualifier from pointer target type [-Wdiscarded-qualifiers]

     ee(&g);

        ^~

<source>:6:15: note: expected 'void *' but argument is of type 'volatile int *'

 void ee(void *q)

         ~~~~~~^

<source>:18:8: warning: passing argument 1 of 'ee' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]

     ee(&f);

        ^~

<source>:6:15: note: expected 'void *' but argument is of type 'const int *'

 void ee(void *q)

         ~~~~~~^

Compiler returned: 0

答案 2 :(得分:1)

不,不是必需的,它只是使代码更清楚地明确传递给函数的内容。