将void指针传递给if条件

时间:2014-09-07 12:02:57

标签: c pointers if-statement

据我所知,在C中,

● A value of zero represents false.
● Any nonzero value represents true.

在以下代码中

void *counting_thread(void *c) 
{
  int i, *j; 
  if(c) j = c;
  else  j = &i;    

  ....

}

我无法理解如何在if条件中评估void指针。如何在以下两种情况下评估if条件?

If c is a null pointer 
If c is not a null pointer

3 个答案:

答案 0 :(得分:3)

在布尔上下文中计算的任何指针(对象指针,函数指针,void指针)如果为空则为false,否则为true

答案 1 :(得分:1)

我认为C99标准中的以下引用会阻止你。

  

6.3.1.2布尔类型

     

1当任何标量值转换为_Bool时,如果是,则结果为0   值比较等于0;否则,结果是1.59

     

6.8.4.1 if语句约束

     

1 if语句的控制表达式应具有标量   类型。

     

2在两种形式中,如果表达式,则执行第一个子语句   比较不等于0。

所以在这个陈述中

if(c) j = c;

检查类型void *的指针c是否包含0或某些非零值。

考虑以下计划

#include <stdio.h>

int main( void )
{
    void *p;
    int x = 10;

    p = NULL;

    if ( p ) puts( "p is not equal to 0" );
    else puts( "p is equal to 0" );

    p = &x;

    if ( p ) puts( "p is not equal to 0" );
    else puts( "p is equal to 0" );

    return 0;
}

输出

p is equal to 0
p is not equal to 0

答案 2 :(得分:0)

正如Kerrek SB所写,空指针的计算结果为false,所有其他指针的结果为true。因此,如果c是空指针,则会为j分配局部变量i的地址。如果c不是空指针,则j将指向内存c指向。

此类构造的意图很可能为稍后的某些代码提供有效的指针,该代码需要有效int *来写入,counting_thread的调用方可能提供也可能没有提供