J'ai du mal à comprendre *(uint32_t*)
.
Disons que j'ai
uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); //what does this do? does it
uint32_t
est un type numérique qui garantit 32 bits, la valeur est non signée, ce qui signifie que la plage de valeurs va de 0 à 232 - 1.
Cette
uint32_t* ptr;
déclare un pointeur de type uint32_t
, mais le pointeur n'est pas initialisé, ce qui signifie que le pointeur ne pointe pas vers un endroit en particulier. Essayer d'accéder à la mémoire via ce pointeur provoquera un comportement indéfini et votre programme risque de tomber en panne.
Cette
uint32_t num;
est juste une variable de type uint32_t
.
Cette
*(uint32_t*)(ptr + num);
ptr + num
vous renvoie un nouveau pointeur. Cela s'appelle l'arithmétique de pointeur, c'est comme l'arithmétique normale seulement que le compilateur prend en compte la taille d'un type. Penser à ptr + num
comme adresse mémoire basée sur le pointeur ptr
d'origine plus le nombre d'octets pour num
uint32_t
objets.
Le (uint32_t*) x
_ est un cast, cela indique au compilateur qu'il doit traiter l'expression x
comme s'il s'agissait d'un unit32_t
. Dans ce cas, ce n'est même pas nécessaire car ptr + num
est déjà un uint32_t*
.
Le *
au début est l'opérateur de déréférencement utilisé pour accéder à la mémoire via un pointeur. L'expression entière est équivalente à
ptr[num];
Comme aucune de ces variables n’a été initialisée, les résultats seront vains. Cependant, si vous les initialisez comme ceci:
uint32_t arr[] = { 1, 3, 5, 7, 9 };
uint32_t *ptr = arr;
uint32_t num = 2;
printf("%u\n", *(ptr + num));
cela afficherait 5, parce que ptr[2]
a 5 ans.
uint32_t
est défini dans stdint.h
, alors il faudra peut-être l'inclure
#include <stdint.h>
Cela ne fait vraiment rien. Laissez-moi vous donner un exemple différent:
uint32_t data;
void *pointer = &data;
*(uint32_t *)pointer = 5;
Tout d'abord, void*
signifie un pointeur "générique". Il peut pointer sur des objets de tout type.
À présent, (uint32_t *)
signifie "interprète pointer
comme un pointeur sur un objet de type uint32_t
.
Le reste de l'expression signifie simplement "enregistrez 5 à l'emplacement stocké par ce pointeur".
Si vous voulez savoir quoi uint32_t
_ est un entier non signé de 32 bits exactement. Et pointer + num
est identique à l'adresse de pointer[5]
.