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 :

'const char*', 'char const*', 'const *char' et 'char *const'


Sujet :

C

  1. #1
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut 'const char*', 'char const*', 'const *char' et 'char *const'
    Bonjour à tous,

    J'aimerais que vous m'éclairiez sur les différences entre ces expressions.

    • Si j'ai bien compris, 'const char*' et 'char const*' sont équivalents : ce sont des pointeurs sur une chaîne de caractère non-modifiable.
    • 'const *char' est un pointeur non-modifiable pointant sur un caractère.
    • 'char *const' est… euh… ça existe ?


    Est-ce que j'ai tout juste ? et qu'en est-il pour la 4e expression (3e point) ?

    Merci et bon développement à tous

  2. #2
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    Salut,
    http://c.developpez.com/faq/cpp/?pag...har_const_char
    je suppose que tu as déjà regardé mais bon...
    oui pour la 1.

    <<Une fonction qui prend un const char* déclare qu'elle va lire le contenu du buffer sans le modifier (accès en lecture seule).>> pour la deux.

    pour la troisième, la fonction systeme execv :
    int execv (const char *path, char *const argv[]);

    donc voila, deja ca te permet d'avancer!

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par Spootnik
    • Si j'ai bien compris, 'const char*' et 'char const*' sont équivalents : ce sont des pointeurs sur une chaîne de caractère non-modifiable.
    • 'const *char' est un pointeur non-modifiable pointant sur un caractère.
    • 'char *const' est… euh… ça existe ?
    Moi, je dirais plutôt:
    • const char * et char const * sont équivalents (pointeurs sur caractère(s) non-modifiable(s)). En fait const est toujours supposé s'appliquer sur le type à sa gauche : La première écriture est l'exception puisqu'il n'y a rien à gauche.
    • "const * char", ça compile, ça ??
    • char * const est un pointeur non-modifiable sur caractère(s) modifiable(s).

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    J'ajoute qu'il y'a également l'écriture suivante qui est possible:
    C'est il me semble les deux réunis soit un pointeur non modifiable sur une chaîne de caractères non modifiable ...

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    C'est ça: Pointeur non-modifiable sur caractère(s) non-modifiable(s).

    Et on peut obtenir plus marrant avec char const * const * const : Pointeur non-modifiable sur pointeur(s) non-modifiable(s) sur caractère(s) non-modifiable(s)...

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Médinoc
    C'est ça: Pointeur non-modifiable sur caractère(s) non-modifiable(s).

    Et on peut obtenir plus marrant avec char const * const * const : Pointeur non-modifiable sur pointeur(s) non-modifiable(s) sur caractère(s) non-modifiable(s)...
    Oui c'est tout beau tout joli

  7. #7
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Soit dit en passant, il est impossible de caster un "const void *" en "const char **", on ne peut le mettre que dans un "const char * const *" => chaque dimention doit être const (sauf le pointeur si il ne l'était pas).

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    De plus, on ne peut, en C standard, caster implicitement un char** en char const * const *. Le compilateur C de Visual C++ le propose en tant qu'extension, le standard C++ le permet, mais gcc (qui respecte le standard C quand il le veut bien) ne le permet pas et ne propose aucune extension pour le permettre.

    Ce qui nuit grandement à la const-correctness, suite à une interdiction dont la raison m'échappe...

  9. #9
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Et bien c'est expliqué ici http://c.developpez.com/tutcpp/x1733.php

    J'ai bien compris le raisonnement, mais au final je trouve que c'est un peu débile.
    Regardez, moi aussi j'ai reussi à casser la const strict-ness avec le meme raisonnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char * s = strdup("abc");
    const char * cs = s;
    s[0] = 'k';
    /* regardez, j'ai modifié les caractères pointés par cs ! */

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ce cours explique const char **, mais pas const char * const *, hors c'est le second que je trouve stupide.

    Ton exemple ne montre pas vraiment d'atteinte à la const-correctness, car le pointeur modifiable ne peut être obtenu à partir du pointeur non-modifiable.

    En clair, tu passes le pointeur const à la fonction, tu sais qu'elle ne pourra pas s'en servir pour modifier la chaîne. Pour moi, c'est à cela que sert la const-correctness, pas à empêcher que la chaîne soit modifiée par une autre fonction qui en a le droit.

    En clair, cs n'a pas selon moi à garantir que les caractères sont vraiment constants, mais seulement à garantir que cs ne peut pas servir à modifier les caractères.


    La grande faille du C concernant la const-correctness, c'est strchr() : Pour moi, il aurait fallu faire deux fonctions, genre strchr() et strchrc().
    Visual propose deux surcharges de la fonction en C++, mais j'ignore si cela fait partie du standard C++ ou si c'est une extension...

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Gruik
    Et bien c'est expliqué ici http://c.developpez.com/tutcpp/x1733.php

    J'ai bien compris le raisonnement, mais au final je trouve que c'est un peu débile.
    Regardez, moi aussi j'ai reussi à casser la const strict-ness avec le meme raisonnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char * s = strdup("abc");
    const char * cs = s;
    s[0] = 'k';
    /* regardez, j'ai modifié les caractères pointés par cs ! */
    Je ne crois pas que le raisonnement présenté ici est similaire à celui présenté dans le cours de Christian Castehyde. Il ne me semble pas que dans ton code, on casse ce que tu appelles la const strictness. s est un pointeur sur caractère (non-constant) qui pointe sur une zone mémoire modifiable. Cela te choque qu'on puisse modifier la chaîne de caractères retournée par strdup via le pointeur s?

    Le présenté dans le cours que tu as donné en lien est à mon sens plus tordu que cela.

    Thierry

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Le post de Gruik met plutôt en évidence le problème d'aliasing des pointeurs qu'un vrai problème de const-correctness :
    Ce qui "choque" Gruik, c'est qu'on puisse modifier les données pointées par un pointeur const en utilisant le pointeur non-const d'origine (donc, à l'insu du plein gré du pointeur const).

    En effet, avoir un pointeur const sur une variable ne "verrouille" pas la variable en interdisant toute écriture dessus par quiquonque...

  13. #13
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    C'est vrai en revanche, comme tu l'as relevé plus haut, que l'interdiction du cast char ** en char const *const * est difficilement compréhensible, car les problèmes évoqués par Christian Castehyde dans son cours ne peuvent pas (je crois) avoir lieu avec un pointeur de type char const *const *:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const char c = 'a';      
    char *p_c = NULL;
    /* Supposons que ceci soit autorisé */            
    const char *const *pp_c = &p_c;  
    /* INTERDIT par la constance du pointeur pointé par ppc */
    *pp_c = &c;
    Thierry

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    D'ailleurs, c'est autorisé en C++ (et sous Visual en tant qu'extension)

Discussions similaires

  1. malloc sur char* (avec le sizeof d'un char[])
    Par fcjunic dans le forum Débuter
    Réponses: 2
    Dernier message: 01/02/2011, 08h32
  2. [Appli Console]Pb exec command ac fct system(const char *)
    Par Le_magicien999 dans le forum MFC
    Réponses: 2
    Dernier message: 16/08/2005, 16h07
  3. Conversion CString en const char*
    Par LRobi dans le forum MFC
    Réponses: 8
    Dernier message: 19/07/2005, 12h12
  4. Réponses: 13
    Dernier message: 06/03/2005, 15h21
  5. Pb d'nitialisation d'un const char*
    Par davkick dans le forum C++
    Réponses: 9
    Dernier message: 09/12/2004, 16h27

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