web-dev-qa-db-fra.com

Qu'est-ce que * (uint32_t *)

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 
7
Hoa.N

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 numuint32_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.

21
Pablo

uint32_t est défini dans stdint.h, alors il faudra peut-être l'inclure

#include <stdint.h>
3
user7610

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].

1
giusti