L'Arithmétique des pointeurs: ++*ptr ou *ptr++?
Je suis en train d'apprendre le langage C et assez confus les différences entre ++*ptr
et *ptr++
.
Par exemple:
int x = 19;
int *ptr = &x;
Je sais ++*ptr
et *ptr++
produire des résultats différents, mais je ne suis pas sûr pourquoi est-ce?
Vous devez vous connecter pour publier un commentaire.
Ces déclarations produire des résultats différents en raison de la façon dont les opérateurs se lier. En particulier, le préfixe
++
opérateur a la même priorité que*
, et ils l'associent à droite-à-gauche. Ainsiest analysée comme
sens "incrémenter la valeur pointée par
ptr
,". D'autre part, la postfix++
opérateur a une priorité plus élevée que la dereferrence opérateur*
. Theforesignifie
qui signifie "évaluer à la valeur actuellement pointée par
ptr
, et incrémenter la valeur deptr
" (l'ordre de ce qui n'est pas spécifié).Dans le contexte décrit, vous voulez probablement écrire
++*ptr
, qui serait incrémentx
indirectement par l'intermédiaire deptr
. Écrit*ptr++
serait dangereux, car il serait marsptr
de l'avant dernièrex
, et depuisx
ne fait pas partie d'un tableau le pointeur serait balançant quelque part dans la mémoire (peut-être sur le dessus de lui-même!)Espérons que cette aide!
*ptr++
est équivalent à*(ptr++)
équivalent à*(ptr = ptr + sizeof(datatype))
*ptr++
sera utile , si votre ptr pointe sur une chaîne et que vous voulez sauter à caractère suivant dans la chaîne.*(ptr++)
.ptr + sizeof(datatype)
va effectivement passersizeof(datatype) * sizeof(datatype)
octets. Voir cet exemple. [Note: l'Exemple est compilé comme C au lieu de C++, en raison de-xc
option de ligne de commande.]Accepté la réponse n'est pas correcte. Ce n'est pas le cas que la postfix
++
opérateur a la même priorité que de déréférencement/indirection*
. Le préfixe et le suffixe opérateurs différents priorité, et seul le préfixe opérateur a la même priorité que de déréférencement/indirection.Comme le tableau de précédence montre, postfix
++
a un plus priorité supérieure à déréférencer/indirection*
. Donc*ptr++
obtient évalué comme*(ptr++)
.ptr++
évalue à la valeur actuelle deptr
; il incrémenteptr
seulement comme un effet secondaire. La valeur de l'expression est la même que la valeur actuelle deptr
. Afin de ne pas avoir d'effet sur la valeur stockée à l'aide du pointeur. Il se borne à déréférencer le pointeur (c'est à dire, obtenir la valeur actuelle y sont stockées, qui est de 19), puis avancer le pointeur. Dans votre exemple, il n'existe pas de valeur stockée à la nouvelle position deptr
, de sorte que le pointeur pointe vers la poubelle. Un déréférencement maintenant serait dangereux.Aussi comme le montre le tableau, le préfixe
++
a la même priorité que de déréférencement/indirection*
, mais parce que de droite-associativité gauche, il obtient évalué comme++(*ptr)
. Ce sera d'abord déréférencer le pointeur (c'est à dire, obtenir la valeur stockée à l'adresse pointée) et puis incrémenter cette valeur. I. e., la valeur sera désormais 20.Accepté la réponse est correcte sur les effets des deux, mais le mécanisme est différent de celui qui est donné là.
ptr++
évalue àptr
.*ptr
renvoie une l-value. Donc++*ptr
sera absolument modifier la valeur de l'objet pointé parptr
(x
).Comme templatetypedef dit, mais vous devez fournir les parenthèses autour de
*ptr
pour assurer le résultat. Par exemple, à la suite de rendements 1606415888 à l'aide de GCC et de 0 à l'aide de CLang sur mon ordinateur:Et vous attend
x
à 20. Donc, utiliser(*ptr)++
à la place.