Pointeur Arithmétique: ++ * ptr ou * ptr ++?

J’apprends le langage C et ai assez confondu les différences entre ++*ptr et *ptr++ .

Par exemple:

 int x = 19; int *ptr = &x; 

Je sais que ++*ptr et *ptr++ produisent des résultats différents, mais je ne suis pas sûr de savoir pourquoi.

    Ces instructions produisent des résultats différents en raison de la manière dont les opérateurs sont liés. En particulier, l’opérateur prefix ++ a la même priorité que * , et ils associent de droite à gauche. Ainsi

     ++*ptr 

    est analysé comme

     ++(*ptr) 

    signifiant “incrémenter la valeur pointée par ptr ,”. D’autre part, l’opérateur postfix ++ a une priorité plus élevée que l’opérateur de déréglement * . Donc

     *ptr++ 

    veux dire

     *(ptr++) 

    ce qui signifie “évalue à la valeur actuellement pointée par ptr , et incrémente la valeur de ptr ” (dont l’ordre n’est pas spécifié).

    Dans le contexte que vous avez décrit, vous souhaiterez probablement écrire ++*ptr , ce qui incrémenterait x indirectement par le biais de ptr . Écrire *ptr++ serait dangereux car cela ferait avancer ptr avant de x , et comme x ne fait pas partie d’un tableau, le pointeur serait suspendu quelque part en mémoire (peut-être sur lui-même!)

    J’espère que cela t’aides!

    La réponse acceptée n’est pas correcte. Ce n’est pas le cas que l’opérateur postfix ++ ait la même priorité que dereference / indirection * . Les opérateurs de préfixe et de postfix ont une priorité différente et seul l’opérateur de préfixe a la même priorité que dereference / indirection.

    Comme le montre le tableau des priorités , postfix ++ a une priorité supérieure à dereference / indirection * . Ainsi, *ptr++ est évalué comme *(ptr++) . ptr++ à la valeur actuelle de ptr ; il incrémente ptr uniquement en tant qu’effet secondaire. La valeur de l’expression est la même que la valeur actuelle de ptr . Cela n’aura donc aucun effet sur la valeur stockée au pointeur. Il va simplement déréférencer le pointeur (c’est-à-dire obtenir la valeur courante qui y est stockée, qui est 19), puis faire avancer le pointeur. Dans votre exemple, il n’y a pas de valeur définie stockée à la nouvelle position de ptr , le pointeur pointe donc sur garbage. Déréférencer cela maintenant serait dangereux.

    Comme le montre la table, prefix ++ a la même priorité que dereference / indirection * , mais en raison de son associativité droite-gauche, il est évalué en tant que ++(*ptr) . Cela déréférencera d’abord le pointeur (c’est-à-dire récupère la valeur stockée à l’adresse indiquée) et incrémente ensuite cette valeur. C’est-à-dire que la valeur sera maintenant de 20.

    La réponse acceptée est correcte sur les effets des deux, mais le mécanisme réel est différent de celui qui est donné ici.

    Comme le dit templatetypedef, mais vous devez fournir la parenthèse autour de *ptr pour assurer le résultat. Par exemple, les rendements suivants utilisent 1606415888 avec GCC et 0 avec CLang sur mon ordinateur:

     int x = 19; int *ptr = &x; printf("%d\n", *ptr++); printf("%d\n", *ptr); 

    Et vous vous attendiez à ce que x soit égal à 20. Utilisez donc (*ptr)++ place.