| 11.2. Type NamesTo convert a value explicitly from one type to another using the cast operator, you must specify the new type by name. For example, in the cast expression (char *)ptr, the type name is char * (read: "char pointer" or "pointer to char"). When you use a type name as the operand of sizeof, it appears the same way, in parentheses. Function prototype declarations 
 also designate a function's parameters by their type names 
 
, even if the parameters themselves have no names. The syntax of a type name is like that of an object or function declaration, but with no identifier (and no storage class specifier). Two simple examples to start with: 
    unsigned char
 The type unsigned char. 
    unsigned char *
 The type "pointer to unsigned char." In the examples that follow, the type names are more complex. Each type name contains at least one asterisk (*) for "pointer to," as well as parentheses or brackets. To interpret a complex type name, start with the first pair of brackets or parentheses that you find to the right of the last asterisk. (If you were parsing a declarator with an identifier rather than a type name, the identifier would be immediately to the left of those brackets or parentheses.) If the type name includes a function type, then the parameter declarations must be interpreted separately. 
 float *[ ]The type "array of pointers to float." The number of elements in the array is undetermined.
 float (*)[10]The type "pointer to an array of ten elements whose type is float."
 double *(double *)The type "function whose only parameter has the type pointer to double, and which also returns a pointer to double."
 double (*)( )The type "pointer to a function whose return value has the type double." The number and types of the function's parameters are not specified.
 int *(*(*)[10])(void)The type "pointer to an array of ten elements whose type is pointer to a function with no parameters which returns a pointer to int."
  |