A: |
You can not dereference a void pointer, without an explicite typecasting,
because the compiler can't know the size of an object pointed to by it.
You can do an explicite typecast:
*(char*)screen = 0xFF;
Or better, if you need to dereference it often, then declare
unsigned char *screen = LCD_MEM;
i.e. avoid void pointers for this purpose (continue reading to see why
such assignment is legal, i.e. assigning LCD_MEM
which is a void pointer to a char pointer).
Void pointers are used mainly as arguments of functions which
represents memory addresses, no matter what is the object located at
that addresses. Then, any pointer type (including arrays, which are
in fact pointers to the first element of the array) may be passed
to such function without warnings and without needness for explicite
typecasting. For example, memcpy is such
function, and it is declared as:
void *memcpy (void *source, void *destination, unsigned long len);
Ignore returned type for a moment. So, you can do
memcpy (LCD_MEM, buffer, 3840);
but you also can do
memcpy (a, b, 10 * sizeof(long));
assuming that you have declared
long a[10], b[10];
somewhere in the program. Second, void pointers may be assigned to any
other pointer type and vice versa without and warnings and without
needness for explicite typecasting. They are usually returned as the
result of functions which don't make any assumptions what will be
purpose of returned pointer. For example, malloc
is such function. It is declared as
void *malloc (unsigned long len);
So, assuming that you have declared
char *a;
int *b;
long *c;
you can do
a = malloc (100);
b = malloc (30 * sizeof(int));
c = malloc (50 * sizeof(long));
without any problems.
|