One often needs to read from memory one byte at a time, like in this naive memcpy() implementation:
void *memcpy(void *dest, const void *src, size_t n)
{
char *from = (char *)src;
char *to = (char *)dest;
while(n--) *to++ = *from++;
return dest;
}
However, I sometimes see people explicitly use unsigned char * instead of just char *.
Of course, char and unsigned char may not be equal. But does it make a difference whether I use char *, signed char *, or unsigned char * when bytewise reading/writing memory?
UPDATE: Actually, I’m fully aware that c=200 may have different values depending on the type of c. What I am asking here is why people sometimes use unsigned char * instead of just char * when reading memory, e.g. in order to store an uint32_t in a char[4].
You should use
unsigned char. The C99 standard says thatunsigned charis the only type guaranteed to be dense (no padding bits), and also defines that you may copy any object (except bitfields) exactly by copying it into anunsigned chararray, which is the object representation in bytes.The sensible interepretation of this is to me, that if you use a pointer to access an object as bytes, you should use
unsigned char.Reference: http://blackshell.com/~msmud/cstd.html#6.2.6.1 (From
C1x draftC99)