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 :

Format de déclaration d'un pointeur


Sujet :

C++

  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut Format de déclaration d'un pointeur
    Bonjour,
    Je recycle sûrement de vieux débats, mais ma question est la suivante : lequel de ces deux formats de déclaration de pointeurs est-il le plus raisonnable d'utiliser et - surtout - d'inculquer aux jeunes () générations :

    ou
    De mon point de vue, seul le premier format semble cohérent par rapport au reste du langage C/C++ : le type de la variable (int*) suivi du nom de la variable (a). Ce format de déclaration peut donc être compris comme celui de n'importe quel type primitif.
    Ici int* a une taille qui lui est propre (selon l'architecture), est stocké et disposé en mémoire comme n'importe quelle valeur, bref c'est presque un type comme un autre si ce n'est qu'il contient une adresse mémoire.

    Tout ça n'est peut-être qu'un détail, mais qu'est ce qui pousse autant (une majorité ?) de développeurs à utiliser le second format, si ce n'est le fait de pouvoir déclarer plusieurs pointeurs en une seule ligne ?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Disons que dans le 2eme cas, je voie plus vite que "a" est un pointeur car l'étoile est collée à la variable (mais c'est très subjectif et très personnel).

    Il y a une 3ème solution pour l'écriture :
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Je ne résiste pas au plaisir de citer Bjarne Stroustup, dans une conférence ou il évoque les difficultés que traverse parfois le comité dans l'élaboration du nouveau standart:

    Citation Envoyé par BS
    Most people prefer to fiddle with details.
    "Most people don't want to argue about the big things. You come with something like [...] how to do a type system for templates... But you don't get a discussion about that. Now, if you discuss about how to write a for-loop, you get a really, splendid discussion. And if you start arguing whether you should have a space in-between the int and the * in a pointer you get a REALLY, furious discussion. People actually, LOVE discussing things that don't matter, because it's so easy to have an opinion about those things... "
    Aie.
    Bon, bien sur le problème est réglé depuis longtemps , int* a est clairement meilleur, car on voit plus vite que "a" est un pointeur car l'étoile est collée au type, donc a est de type (int*)

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Et si ces questions étaient plus sérieusement tranchées en C++ ce cher Bjarne n'en entendrait plus parler pendant ses conventions

    A mon sens le C++ est déjà suffisamment dégueulasse (vive les * et & multi-usages...) pour qu'on laisse en plus ce genre de libertés aux programmeurs. Prenez exemple sur Java, enfin.

    (hein, quoi ? un troll ? où ça ?)

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Ouai enfin, comme il le dit c'est loin d'être vital. Je vois pas pourquoi c'est le langage qui déciderai. Certains préfère avant d'autre après (on a eu l'exemple sur ce topic).

    Le C++ dégueulasse? u_U

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 118
    Billets dans le blog
    148
    Par défaut
    Wahou, du coup comment part le sujet ...

    En plus j'étais pas du même avis que ram-0000 :p
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    De toute façon, dans un programme en C++, la notation * pour désigner un pointeur est tellement rare, que c'est inutile de préciser sous quelle forme l'écrire.

    La vraie question, c'est faut il écrire :
    vector<int>, shared_ptr<int>, unique_ptr<int>
    Ou bien :
    vector< int >, shared_ptr< int >, unique_ptr< int >
    Ou encore
    vector <int> , shared_ptr <int> , unique_ptr <int>

    Mais globalement, on s'en moque...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    Un jour, j'ai essayé ceci :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int *     a,b,c;
    int      *a,b,c;

    Quelles sont, à vue de nez, les variables déclarées par chacune de ces expressions, sachant que ces expressions sont les mêmes ?

    Laquelle correspond le mieux à la réalité ?

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Un jour, j'ai essayé ceci :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int *     a,b,c;
    int      *a,b,c;

    Quelles sont, à vue de nez, les variables déclarées par chacune de ces expressions, sachant que ces expressions sont les mêmes ?

    Laquelle correspond le mieux à la réalité ?
    Aucune...

    La meilleure solution dans ce cas là est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int *a; // ou int* a; ou encore int * a; pour ne vexer personne :D
    int b;
    int c;
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Laquelle correspond le mieux à la réalité ?
    Celle-ci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef int* intptr;
    intptr a, b, c;

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Celle-ci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef int* intptr;
    intptr a, b, c;
    Mais, là, tu ne déclares plus le même genre de variable pour b et c
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Aucune...

    La meilleure solution dans ce cas là est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int *a; // ou int* a; ou encore int * a; pour ne vexer personne :D
    int b;
    int c;
    Citation Envoyé par Arzar Voir le message
    Celle-ci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef int* intptr;
    intptr a, b, c;
    Je rappelle que mon post faisait référence à celui-c !

    Je voulais mettre en évidence le fait que dans le premier cas, l'expression semble déclarer trois pointeurs sur int et que dans le second, elle semble déclarer un pointeur sur int et deux int véritables, chose qu'elle fait réellement.

    Donc, pour répondre à cob59, il vaut mieux écrire « int *a » plutôt que « int* a » pour bien mettre en évidence le fait que l'étoile s'applique au nom de la variable et pas à celui du type.

  13. #13
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais, là, tu ne déclares plus le même genre de variable pour b et c
    Et si !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typdef int* intptr;
    intptr a, b, c;
    b = new int; // aucun problème, b est bien un int*
    *b = 5;
    int* est un type. La preuve c'est qu'on peut en faire un alias avec typedef.
    Le fait que la déclaration [int* a, b, c;] ne déclare pas trois pointeurs, contrairement à ce que l'on s'attend intuitivement, n'est qu'un héritage d'une bizarrerie du C.

    Edit : Fascinant, même les différentes versions de wikipedia ne s'accordent pas sur ce qu'est un pointeur.
    française : Un pointeur est en programmation une variable contenant une adresse mémoire.
    anglaise : In computer science, a pointer is a programming language data type whose value refers directly to (or "points to") another value stored elsewhere in the computer memory using its address.
    allemande : Mit Zeiger oder Pointer wird in der Informatik eine spezielle Variable bezeichnet, die auf eine andere Variable oder Funktion verweist.

    Un pointeur est donc une variable, un type de donnée et une "variable spéciale". On n'est pas couché !

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    il vaut mieux écrire « int *a » plutôt que « int* a » pour bien mettre en évidence le fait que l'étoile s'applique au nom de la variable et pas à celui du type.
    Et qu'est ce que tu entends exactement par « l'étoile s'applique à » ?

  15. #15
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Et si !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typdef int* intptr;
    intptr a, b, c;
    b = new int; // aucun problème, b est bien un int*
    *b = 5;
    int* est un type. La preuve c'est qu'on peut en faire un alias avec typedef.
    Le fait que la déclaration [int* a, b, c;] ne déclare pas trois pointeurs, contrairement à ce que l'on s'attend intuitivement, n'est qu'un héritage d'une bizarrerie du C.
    Sauf que, jutement avec le typedef tu déclares trois pointeurs, alors que, sans le typedef, quelle que soit la position de l'étoile, tu déclares un pointeur et... deux int...

    parce que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int* a, b, c;
    int d = 10;
    a = &d; // OK: a est bien un pointeur
    b = &d; // NOK : impossible de convertir un int en int* ;)
    Et donc, partant du fait, que je répète à longueur d'années, qu'un code est plus souvent lu que compilé, et que la première qualité d'un code - avant même de faire ce qu'on attend de lui -doit être d'être facilement compréhensible et non ambigu pour le lecteur, la meilleure solution reste donc bel et bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int * a;
    int b;
    int c;
    Parce qu'il n'y a ici aucune différence au point de vue des performances, mais que, par contre, nous évitons
    que le lecteur ne croie avoir affaire à trois pointeurs
    que le lecteur ne "zappe" la déclaration de l'une des variables (ici, le risque est faible, mais il est beaucoup plus présent dans un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int mavar1, mavar2, matroisiemevariable, maquatriemevariable, mavariabledifferente;
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #16
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 138
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Bon, bien sur le problème est réglé depuis longtemps , int* a est clairement meilleur, car on voit plus vite que "a" est un pointeur car l'étoile est collée au type, donc a est de type (int*)
    Non car ça voudrait dire que

    permettrait de déclarer 3 pointeurs or en fait seul a serait un pointeur dans cette situation...

    Il faut donc mettre

    et là on est obligé de coller les étoiles aux noms des variables.

    Donc cette façon de faire s'impose d'elle-même ^^ (en quelque sorte ). Moi ça ne me pose aucun problème...

  17. #17
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Silverstone Voir le message
    Non car ça voudrait dire que

    permettrait de déclarer 3 pointeurs or en fait seul a serait un pointeur dans cette situation...

    Il faut donc mettre

    et là on est obligé de coller les étoiles aux noms des variables.

    Donc cette façon de faire s'impose d'elle-même ^^ (en quelque sorte ). Moi ça ne me pose aucun problème...
    C'est une des raisons pour lesquelles il est largement préférable de respecter la règle d'une déclaration ou un instruction par ligne...

    Cette règle, pourtant simplissime, permet de s'éviter bien des déconvenues dues à une mauvaise interprétation du code lorsque le lecteur est, au choix (plusieurs possibles)
    • distrait
    • pressé
    • peu habitué
    • d'autres possible

    J'ai personnellement la conviction que si les gens acceptaient de perdre, au total, quelques minutes à peine à écrire directement un code "dans les règles du lard" (AKA: en le commentant, en l'indentant correctement, en veillant à éviter les effets de bord et en veillant à n'écrire qu'une déclaration/définition/instruction par ligne), les délais nécessaires au débuggage et à la recherche d'erreur seraient très largement moins importants que ce que l'on rencontre (trop) régulièrement à de nombreux niveaux...

    Bien sur, cela nécessite un minimum de rigueur, mais c'est réellement le genre de rigueur qui permet d'éviter de trop dépasser les délais, et qui représente dés lors un investissement qui vaut la peine

    [EDIT]Et je rajouterais d'ailleurs que, si les gens prenaient l'habitude et la peine de réfléchir à leur algorithme et à le mettre sur papier en utilisant une méthode adaptée aux langages de troisième génération (ce qui exclu le flowchart, bien que le "pseudo code" ne soit pas forcément plus adapté), ils auraient, pour autant que leur logique soit correcte, la quasi certitude que leur code fasse exactement ce qu'ils en attendent à la première compilation réussie (AKA après correction des inévitables erreurs de syntaxe telles que faute de frappe, qu'un ; ou une fermeture d'accolade oubliée)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #18
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Le plus amusant dans tout ça, c'est que ceux qui déclarent suivant ce format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void maFonction(const type *param)
    sont bien embêtés quand il s'agit de faire l'équivalent avec une référence mais s'obstinent quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void maFonction(const type & param)


    Enfin je reste convaincu que ce genre de libertés n'apportent pas grand chose au langage et compliquent même sont apprentissage.

  19. #19
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 138
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Le plus amusant dans tout ça, c'est que ceux qui déclarent suivant ce format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void maFonction(const type *param)
    sont bien embêtés quand il s'agit de faire l'équivalent avec une référence mais s'obstinent quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void maFonction(const type & param)
    La 1ère déclaration est bien (même si le mot const n'est pas vraiment nécessaire dans l'exemple) et la 2ème moi j'aurai pas mis d'espace entre le & et le nom de la variable...

    Donc je ne vois pas où est le problème .

  20. #20
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    D'ailleurs j'aurais même plus tendance à mettre : (T const &param)

Discussions similaires

  1. Problème déclaration tableau de pointeur.
    Par BlackStitch dans le forum Débuter
    Réponses: 2
    Dernier message: 16/12/2014, 01h35
  2. déclaration d'un pointeur de tableau
    Par nonozor dans le forum Débuter
    Réponses: 4
    Dernier message: 12/08/2008, 07h18
  3. Déclaration des types pointeurs
    Par Mokhtar BEN MESSAOUD dans le forum Débuter
    Réponses: 3
    Dernier message: 09/06/2008, 09h44
  4. [déclaration de variable]Pointeur
    Par ronan99999 dans le forum C
    Réponses: 6
    Dernier message: 04/10/2005, 15h53
  5. Réponses: 4
    Dernier message: 08/02/2005, 20h47

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