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 :

Pointeur sur constante non constante


Sujet :

C

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Pointeur sur constante non constante
    Salut!

    J'ai vu dans la FAQ C la possibilité de déclarer des pointeurs sur constante.

    Mais en faisant des tests je me suis aperçu que l'on pouvait contourner la constance des données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int  const a=10;
    int  * p=&a;
    (*p)++;
    marche et incrémente une constante en passant par son pointeur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int   a=10;
    int  const * p=&a;
    a++;
    marche et incrémente la valeur *p en passant par la variable pointée.

    Quelle est alors l'utilité de déclarer des pointeurs sur constantes
    si les données pointées n'ont pas été précedemment déclarées comme constantes?

    Merci de m'éclairer.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut Re: Pointeur sur constante non constante
    Citation Envoyé par seriousme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int  const a=10;
    int  * p=&a;
    (*p)++;
    marche et incrémente une constante en passant par son pointeur.
    Le compilateur, si il est correctement regle signale ce probleme :

    main.c:9: warning: initialization discards qualifiers from pointer target type
    Ce qui est bien l'effet recherche par const.

    Citation Envoyé par seriousme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int   a=10;
    int  const * p=&a;
    a++;
    marche et incrémente la valeur *p en passant par la variable pointée.
    a n'etant pas constante, il est tout a fait normal que a++ fonctionne.

    Citation Envoyé par seriousme
    Quelle est alors l'utilité de déclarer des pointeurs sur constantes
    si les données pointées n'ont pas été précedemment déclarées comme constantes?
    Les deux utilisations les plus courantes des pointeurs sur constantes sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* p="ma chaine";
    "ma chaine" etant une chaine pouvant etre place dans une zone memoire en read only (depend de l'implementation), cette ecriture empeche l'ecriture de p[0]='t' qui pourrait provoquer une erreur a l'execution

    Dans les prototypes de fonction, ce qui indique que les donnees situe a l'adresse contenue dans le pointeur ne seront pas modifiees. Ici le const permet d'eviter les erreurs de codage dans la fonction et a en plus un role documentaire vis a vis de l'utilisateur de la fonction

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Pointeur sur constante non constante
    Citation Envoyé par seriousme
    J'ai vu dans la FAQ C la possibilité de déclarer des pointeurs sur constante.
    Si il y a écrit 'constante', c'est une erreur qu'il faut corriger. Le qualificateur 'const' qualifie l'objet de 'accès à lecture seule'. Rien à voir avec une [expression ]constante.
    Mais en faisant des tests je me suis aperçu que l'on pouvait contourner la constance des données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int  const a=10;
    int  * p=&a;
    (*p)++;
    marche et incrémente une constante en passant par son pointeur.
    Au prix d'un warning et d'un comportement indéfini. Non, ça ne 'marche ' pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int   a=10;
    int  const * p=&a;
    a++;
    marche et incrémente la valeur *p en passant par la variable pointée.
    Ca, par contre, c'est parfaitement légal. On peut avoir un pointeur const sur une variable, qui interdit à cette variable d'être accessible en écriture via ce pointeur.

    Le typage est faible en C, car on peut toujours le contourner avec un cast. Mais le fait que le code soit compilable, même sans warning, ne signifie pas que le comporteùent soit défini pour autant.

    Le C s'adresse à des gens qui respèctent les intentions du programmeur, notamment celles exprimées par les qualificateurs comme 'const'.

    Si on s'amuse à passer outre, le comportement est indéfini. Point.
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de vos explications!
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/03/2015, 11h12
  2. pointeur sur valeur + constante
    Par MrPchoun dans le forum C++
    Réponses: 2
    Dernier message: 26/01/2015, 00h28
  3. [Virtual Pascal] Paramètre sous forme de constante non typée
    Par Alcatîz dans le forum Autres IDE
    Réponses: 3
    Dernier message: 18/06/2006, 08h13
  4. [Configuration] Problème sur définition de constante
    Par Yobs dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 24/03/2006, 11h40
  5. case non constant
    Par jul54 dans le forum MFC
    Réponses: 4
    Dernier message: 04/02/2004, 14h08

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