The literal 0 is an int. However, it can be used as a universal initializer for every data type, since it is automatically cast to the appropriate type. In this respect, 0 is a special case because the compiler examines its context to determine its type. For example:
void *p = 0; // when 0 is used to initialize a pointer, the compiler treats it as if it were NULL. float salary = 0; // 0 is cast to a float char name[10] = {0}; // 0 cast to a ' ' void (*pf)(int) = 0; // pointer to a function