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 :

Pointeurs et constantes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Pointeurs et constantes
    Hello,

    Soit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tab[] = { 1, 2, 3 };
    const int* ptab1 = tab;
    *(ptab1+1) = -1;
    La dernière ligne ne compile pas, et la logique m'échappe.
    La seconde ligne dit qu'on ne peut pas changer, via ptab1, l'élément placé à l'adresse qu'il contient.
    Mais dans la troisième ligne, je ne vois pas pourquoi le const devrait s'appliquer à (patb1+1). Cette expression désigne une autre adresse, sans nom de variable qui s'y rapporte, et donc sans qualification de constance.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    salut,

    si je parle "logique" et non programmation : tu définis un 'const', qui veut dire que c'est une varaible en "lecture seule", non ?

    je ne vois pas pourquoi le const devrait s'appliquer à (patb1+1)
    Pourquoi ? Je pense que le compilo estime que tu te déplaces dans un tableau de const vu que patb1 est un pointeur sur un const.

    Je ne sais pas quel compilo tu utilises, mais Visual est très explicite dans son message :
    you cannot assign to a variable that is const
    Par contre, aucune alerte sur la 2e ligne (même avec le lvl4 en warning).

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const int* ptab1 = tab;
    *(ptab1+1) = -1;
    équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const int* ptab1 = tab;
    ptab1[1] = -1;
    => c'est donc évident que tu n'as pas le droit de faire ça. Si tu enlèves le "const", ça fonctionnera. Un tableau n'est qu'un pointeur avec une allocation mémoire faite à l'initialisation.


    Par contre, aucune alerte sur la 2e ligne (même avec le lvl4 en warning).
    => c'est normal, car un "const" est plus restrictif qu'un "non const" : tout ce qui est possible de faire avec un "const", tu peux le faire avec un "non const". Par contre si tu fais l'inverse, le compilo indiquera une erreur (je suis pas sure de m'avoir fait comprendre )

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tab[] = { 1, 2, 3 };
    const int* ptab1 = tab;
    *(ptab1+1) = -1;
    Toute opération est du type le plus proche de ses deux arguments, sans pertes d'information.
    ptab1 est un const int*
    1 est un int
    (ptab1 + 1) est du type promu le plus proche, c'est à dire const int*.
    D'où *(ptab1 + 1) est un const int, toujours non assignable


    PS: Je remercie mes profs de physique, qui insistaient sur les dimensions (les unités...) des grandeurs manipulées.
    C'est un réflexe qui est utile en informatique aussi.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Merci à tous !

    Vos explications se complètent bien, et éclairent mon cerveau naguère obscurci par la perplexité.

  6. #6
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Bonjour,

    Il s'agit d'une erreur de langage C en plus d'être une erreur de sens, pour la raison suivante :

    (ptr+1) est une expression du même type que ptr à savoir const int*.
    Alors *(ptr+1) est de type const int.

    Or pour être à gauche de l'opérateur = en C, un objet ne doit pas être qualifié const. Autrement dit, un objet de type const int n'est pas une lvalue modifiable.

    Ps : mes excuses s'il y a une information redondante dans mon intervention.

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Petite précision.
    Une lvalue (left-value) est une valeur qui peut être placé à gauche dans une affectation. Il s'agit de variables non constantes, et de leurs pointeurs déréférencés.
    On appelle rvalue toute valeur qui n'est pas lvalue. (quoique C11 a peut-être complexifié ceci…).

    Ainsi, "lvalue modifiable" est un pléonasme et "lvalue constante" une oxymore.

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Une lvalue (left-value) est une valeur qui peut être placé à gauche dans une affectation.
    C'est l'origine probable du terme lvalue, bien qu'on puisse préfèrer maintenant "locator value".
    Une lvalue est une expression dont le résultat de l'évaluation désigne un objet

    Ainsi, "lvalue modifiable" est un pléonasme et "lvalue constante" une oxymore.
    Je ne crois pas. Elle peut désigner un objet non modifiable. C'est du moins le point de vue de la norme.

    n1256 :
    6.3.2.1 Lvalues, arrays, and function designators
    1 ...A modifiable lvalue is an lvalue that does not have array type, does not have an incomplete type, does not have a const-qualified type, and if it is a structure or union, does not have any member (including, recursively, any member or element of all contained aggregates or unions) with a const-qualified type.
    A noter le cas des tableaux :
    3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue.

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

Discussions similaires

  1. Pointeur constant sur objet constant
    Par escafr dans le forum C++
    Réponses: 4
    Dernier message: 30/06/2008, 17h23
  2. Modifier une chaîne d'un pointeur constant
    Par oranoutan dans le forum C
    Réponses: 7
    Dernier message: 25/05/2007, 16h32
  3. Réponses: 9
    Dernier message: 14/01/2007, 16h40
  4. pointeurs constants et prototype de ma fonction
    Par salseropom dans le forum C
    Réponses: 3
    Dernier message: 23/05/2006, 18h03
  5. Pointeur sur constante non constante
    Par Pragmateek dans le forum C
    Réponses: 3
    Dernier message: 21/03/2006, 14h22

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