The following array and pointer extensions are supported:
Assignment and pointer differences are permitted between pointers to types that are interchangeable but not identical, for example, unsigned char * and char *. This includes pointers to same-sized integral types, typically, int * and long *. A warning is issued.
Assignment of a string constant to a pointer to any kind of character is permitted without a warning.
Assignment of pointer types is permitted in cases where the destination type has added type qualifiers that are not at the top level, for example, assigning int ** to const int **. Comparisons and pointer difference of such pairs of pointer types are also permitted. A warning is issued.
In operations on pointers, a pointer to
voidis always implicitly converted to another type if necessary. Also, a null pointer constant is always implicitly converted to a null pointer of the right type if necessary. In ISO C, some operators permit these, and others do not.
Pointers to different function types can be assigned or compared for equality (
==) or inequality (
!=) without an explicit type cast. A warning or error is issued.
This extension is prohibited in C++ mode.
A pointer to void can be implicitly converted to, or from, a pointer to a function type.
In an initializer, a pointer constant value can be cast to an integral type if the integral type is big enough to contain it.
A non lvalue array expression is converted to a pointer to the first element of the array when it is subscripted or similarly used.