问题
I have a hard time understanding *(uint32_t*)
.
Let's say that I have:
uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); //what does this do? does it
回答1:
uint32_t
is a numeric type that guarantees 32 bits, the value is unsigned,
meaning that the range of values goes from 0 to 232 - 1.
This
uint32_t* ptr;
declares a pointer of type uint32_t*
, but the pointer is uninitialized, that
is, the pointer does not point to anywhere in particular. Trying to access
memory through that pointer will cause undefined behaviour and your program
might crash.
This
uint32_t num;
is just a variable of type uint32_t
.
This
*(uint32_t*)(ptr + num);
ptr + num
returns you a new pointer. It is called pointer arithmetic, it's
like regular arithmetic only that compiler takes the size of a types into
consideration. Think of ptr + num
as the memory address based on the original
ptr
pointer plus the number of bytes for num
uint32_t
objects.
The (uint32_t*) x
is a cast, this tells the compiler that it should treat the
expression x
as if it were a uint32_t*
. In this case it's not even needed
because ptr + num
is already a uint32_t*
.
The *
at the beginning is the dereferencing operator which is used to access
the memory through a pointer. The whole expression is equivalent to
ptr[num];
Now, because none of these variables is initialized, the result will be garbage. However if you initialize them like this:
uint32_t arr[] = { 1, 3, 5, 7, 9 };
uint32_t *ptr = arr;
uint32_t num = 2;
printf("%u\n", *(ptr + num));
this would print 5, because ptr[2]
is 5.
回答2:
uint32_t
is defined in stdint.h
, so one may need to include it
#include <stdint.h>
回答3:
This doesn't really do anything. Let me give you a different example:
uint32_t data;
void *pointer = &data;
*(uint32_t *)pointer = 5;
First of all, void*
means "generic" pointer. It can point to objects of any type.
Now, (uint32_t *)
means "interpret pointer
as a pointer to an object with type uint32_t
.
The rest of the expression simply means "store 5 at the location stored by this pointer".
If you want to know what uint32_t
is, that's an unsigned integer with exactly 32 bits. And pointer + num
is the same as the adress of pointer[5]
.
来源:https://stackoverflow.com/questions/48833976/what-is-uint32-t