Que signifie (int *) p?


Meilleure réponse

(int *) p est un type explicite transtypant la valeur stockée dans la variable p, vers le type dun pointeur dont ladresse pointe vers un entier. La valeur que p stocke est une adresse mémoire du 1er octet des 4 qui sont utilisées pour stocker ledit entier de 32 bits (4 octets).

Un pointeur stocke un nombre qui doit être ladresse dun emplacement spécifique de la mémoire (tas ou pile). Le type de données stockées à cet emplacement peut être nimporte quoi , et dans cette expression, nous spécifions (ou plutôt supposons) quil sagit dun entier de 4 octets.

La valeur de p peut être transtypée avant dêtre affectée à un autre pointeur –

int *c = (int *) p;

Ou, il pourrait être déréférencé pour récupérer la valeur stockée dans ladresse détenue par p comme tel –

int c = *((int *) p);

Ou, si p est effectivement un pointeur lui-même, il pourrait être déréférencé sans lui explicitement typé parce que nous savons que la valeur qui y est stockée est un entier de 4 octets.

Par souci de simplicité, je nai pas vérifié les pointeurs par null. Il est très important de vérifier si un pointeur est nul, car déréférencer un pointeur nul entraîne un plantage.

Exemple de null check –

if (p != null)

printf(“int is ‘\%d’”, *p);

En supposant maintenant le ladresse est correcte et que le pointeur nest pas nul, et que le type de données stocké dans lemplacement mémoire est en fait un entier, votre console limprimera correctement .

Voici un article détaillé et bien expliqué que jai trouvé il y a quelques années, sur la façon de lire les pointeurs en c – Règle dans le sens des aiguilles dune montre / spirale

Réponse

Afin de comprendre ce que (int *) y fait, il est utile de comprendre ce que fait malloc (sizeof (int)). « s le décomposer de droite à gauche.

Premièrement, nous avons une sizeof (int). Il sagit dune valeur représentant le nombre doctets requis pour représenter un entier en mémoire. Cela peut être 4 ou un autre nombre selon lordinateur sur lequel nous programmons.

La fonction malloc () obtient en fait un paramètre comme 4, à la malloc (4). Cette fonction demande le Bibliothèque C pour aller quelque part dans la mémoire et mettre de côté 4 octets (ce qui se trouve être exactement la bonne taille pour contenir un entier).

Maintenant, la fonction malloc renvoie toujours ladresse de cette mémoire. Rappelez-vous cet ordinateur la mémoire est disposée en série, et chaque adresse en mémoire est unique. Maintenant, malloc () nest pas une fonction très intelligente – vous lui indiquez la quantité de mémoire que vous voulez, et il dit « cest ici ». Il ne sait pas quoi vous voulez mettre dans cette mémoire – il ne sait que la quantité de mémoire que vous avez demandée.

Parce que malloc () ne sait pas ce que vous voulez mettre dans cette mémoire, il renvoie un type appelé (void *), cest-à-dire une adresse mémoire arbitraire, également appelée pointeur. Sur la plupart des ordinateurs modernes, une adresse est une valeur de 64 bits, qui peut être représentée dans 8 octets de mémoire – mais les ordinateurs diffèrent r et différents ordinateurs peuvent renvoyer des tailles différentes. Donc, malloc () peut renvoyer 8 octets de données, au format (void *).

Enfin, nous devons entrer dans cette mémoire que malloc () nous a donnée, afin de pouvoir la traiter comme contenant un entier. Comment fait-on cela? malloc () nous a juste donné un pointeur vers une mémoire quelque part dans lespace. Nous faisons cela en disant au compilateur que ladresse mémoire que nous avons récupérée de malloc () est en réalité ladresse dun entier. Doù votre (int *).

Maintenant que vous avez parcouru tout cela, le compilateur comprend alors parfaitement ce que vous vouliez, car vous avez pris la peine de décrire chaque étape: vous voulez un huit octets adresse pointant vers un emplacement de quatre octets en mémoire, qui à son tour contient un entier.

Et cest ce que signifie toute cette expression!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *