IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Question incrémentation de valeur par pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2017
    Messages : 93
    Par défaut Question incrémentation de valeur par pointeur
    Bonjour,

    J'ai une question à propos des pointeurs.
    J'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int main(){
        int val = 5;
        int *p_val = &val;
        printf("val : %d\n",val);
     
        *p_val ++;
        printf("val : %d\n",val);
     
        return 0;
    }
    Je déclare une variable de type int : val et un pointeur p_val et j'incrémente la valeur de val à partir de p_val.
    Sauf que la console affiche :
    Pourquoi ne peut-on utiliser le "++" pour incrémenter?

    Merci

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Hello,

    * (pointeur sur) est prioritaire par rapport à ++: *pval++ incrémente pval, (*pval)++ incémente ce sur quoi pval pointe....

    Désolé, j'ai écrit une bêtise. Merci à Dalfab.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2017
    Messages : 93
    Par défaut
    Merci pour votre réponse.

    Bonne soirée

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Les opérateurs "unaires" tels que * et ++ ont la même priorité mais se regroupent en allant de la droite vers la gauche.
    En utilisant la pré-incrémentation on aurait une utilisation différente des parenthèses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    *p_val++;    // incrémente le pointeur (post-incrémentation) équivalent à p_val++
    *(p_val++);  // idem
    (*p_val)++;  // incrémente la valeur pointée (post-incrémentation)
    ++*p_val;    // incrémente la valeur pointée (pré-incrémentation)
    ++(*p_val);  // idem
    *++p_val;    // incrémente le pointeur (pré-incrémentation), équivalent à ++p_val
    *(++_pval);  // idem

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Documentation : http://en.cppreference.com/w/c/langu...tor_precedence

    Les opérateurs ++a, --a et *a ont la même priorité.
    Les opérateurs a++ et a-- sont plus prioritaires que ++a, --a et *a.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Hello,

    Quand vous dites que a++ est prioritaire sur *a ça veut donc dire que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *a++ = *(a++) = *(a = a + 1)
    Or sur ces deux exemples, je n'ai pas le même résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        int b[2] = {1,2};
        int * a = &b;
     
        printf("val = %i\r\n", *a++);
        printf("offset @a = %u\r\n", a - b);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        int b[2] = {1,2};
        int * a = &b;
     
        printf("val = %i\r\n", *(a = a +1));
        printf("offset @a = %u\r\n", a - b);
    Elle est où mon erreur de raisonnement ?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    J'ai trouvé mon erreur

    on a bien :
    Par contre après c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    *(a++);
    // équivaut à
    *a; a = a+1;
    J'aurais donc du écrire pour le second exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        int b[2] = {1,2};
        int * a = &b;
     
        printf("val = %i\r\n", *a);
        a = a+1;
        printf("offset @a = %u\r\n", a - b);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Valeur par défaut & incrémentation
    Par surf4you dans le forum VB.NET
    Réponses: 7
    Dernier message: 05/01/2015, 10h06
  2. Incrémenter automatiquement lignes par rapport valeur cellule
    Par maximilien59 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/01/2012, 08h57
  3. [MooTools] Questions: Sélecteur et valeur par défault
    Par Storming dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 24/11/2011, 19h20
  4. Réponses: 3
    Dernier message: 20/09/2005, 08h59
  5. Echange de valeurs par pointeur et réf
    Par smag dans le forum C++
    Réponses: 6
    Dernier message: 01/03/2005, 18h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo