What is *(uint32_t*)

自古美人都是妖i 提交于 2020-06-07 12:07:45

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!