What is the use of unsigned char
pointers? I have seen it at many places that pointer is type cast to pointer to unsinged char
Why do we do so?
The unsinged char
type is usually used as a representation of a single byte
of binary data. Thus, and array is often used as a binary data buffer, where each element is a singe byte.
The unsigned char*
construct will be a pointer to the binary data buffer (or its 1st element).
I am not 100% sure what does c++
standard precisely says about size of unsigned char
, whether it is fixed to be 8 bit or not. Usually it is. I will try to find and post it.
After seeing your code
When you use something like void* input
as a parameter of a function, you deliberately strip down information about inputs original type. This is very strong suggestion that the input will be treated in very general manner. I.e. as a arbitrary string of bytes. int* input
on the other hand would suggest it will be treated as a "string" of singed integers.
void*
is mostly used in cases when input gets encoded, or treated bit
/byte
wise for whatever reason, since you cannot draw conclusions about its contents.
Then In your function you seem to want to treat the input as a string of bytes. But to operate on objects, e.g. performing operator=
(assignment) the compiler needs to know what to do. Since you declare input as void*
assignment such as *input = something
would have no sense because *input
is of void
type. To make compiler to treat input
elements as the "smallest raw memory pieces" you cast it to the appropriate type which is unsigned int
.
The cout
probably did not work because of wrong or unintended type conversion. char*
is considered a null terminated string and it is easy to confuse singed
and unsigned
versionin code. If you pass unsinged char*
to ostream::operator<<
as a char*
it will treat and expect the byte
input as normal ASCII characters, where 0
is meant to be end of string not an integer value of 0
. When you want to print contents of memory it is best to explicitly cast pointers.
Also note that to print memory contents of a buffer you would need to use a loop, since other wise the printing function would not know when to stop.