Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Sujet à polémique et discussion - les pointeurs en C/C++
Slyvtt En ligne Maître du Puzzle Points: 2221 Défis: 16 Message

Sujet à polémique et discussion - les pointeurs en C/C++

Posté le 09/06/2022 14:56

Hello,

grave question existentielle que celle qui va suivre : comment déclarer "proprement" les pointeurs en C/C++ ? Quelle syntaxe faut il utiliser ?

Ne vous êtes vous jamais demandés lors de vos lectures de code pourquoi certains déclarent leurs pointeurs ainsi :
int* p;

alors que d'autres les déclarent ainsi :
int *p;

et que les moins téméraires les déclarent tels l'ONU, sans prendre de position, ainsi :
int * p;

bref, qui a tord, qui a raison ?!?

D'un point de vue fonctionnel, c'est Ok quand on a une simple déclaration d'une seule variable de type pointeur, mais il y a des subtilités. Ainsi écrire :
int* p, q;

laisse penser que p et q sont tous les deux des pointeurs vers des int, car l'operateur de déréférencement (*) est accolé au type int, donc en toute logique on déclare deux variables de type (int*), et bien non, perdu !!!
Dans les fait, on obtient p de type pointeur vers int et q de type int (pas pointeur vers int) ... la bonne blague (et la source de bug).

Il s'emblerait donc que la syntaxe à utiliser soit plutôt
type *variable1, variable2, *variable3;

Qu'en pensez vous ?

Sly


Eragon Hors ligne Gardien des bots Points: 418 Défis: 0 Message

Citer : Posté le 09/06/2022 14:58 | #


Toi, t'a eu des problèmes avec ça récemment.
Lephenixnoir En ligne Administrateur Points: 24054 Défis: 169 Message

Citer : Posté le 09/06/2022 15:00 | #


J'écris int *p exactement pour la raison que tu mentionnes, ce qui dans mon expérience est le plus courant.

Mais il n'y a jamais de solution parfaite. Personnellement je pousse cette interprétation jusqu'à mettre les qualifieurs après le type, ce qui est complètement marginal :

int const *p;
// p est lecture-écriture
// *p est lecture-seule

int * const p;
// p est lecture-seule
// *p est lecture-écriture

int const * const p;
// p est lecture-seule
// *p est lecture-seule

Et donc j'écris int const x, char const *str, etc.
Mon graphe (16 Jan): (PythonExtra ; fxsdk#11 ; gint#27 ; (Rogue Life || HH2) ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Ne0tux Hors ligne Membre d'honneur Points: 3520 Défis: 265 Message

Citer : Posté le 09/06/2022 15:27 | #


Autre technique : s'interdire de déclarer plus d'un pointeur par ligne.

Pour ce qui est du const, j'avoue ne pas y apporter d'attention lors de la déclaration. En revanche je l'ajoute automatiquement lorsqu'il s'agit de définir les paramètres de fonction, pour garantir que le pointeur soit en lecture seule et la variable pointée en lecture/écriture.
Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Slyvtt En ligne Maître du Puzzle Points: 2221 Défis: 16 Message

Citer : Posté le 09/06/2022 16:31 | #


Eragon a écrit :
Toi, t'a eu des problèmes avec ça récemment.


Pas récemment, mais j'avoue avoir eu par le passé une surprise avec ça (la definition de "int* p, q, r;" et de me prendre une banane avec q et r, pensant à tord qu'ils étaient de type pointeurs vers int. Du coup j'écris systématiquement "int *p, *q, *r;" désormais pour plus me faire avoir.

Mais plus récemment (hier), je suis tombé sur du code source écris de l'autre manière. alors j'ai regardé sur les forums ce qu'il existait comme explication. Et on trouve un peu de tout.

Effectivement, comme écrit par Lephe, le int *p semble majoritaire.
There are only 10 types of people in the world: Those who understand binary, and those who don't ...

Slyvtt En ligne Maître du Puzzle Points: 2221 Défis: 16 Message

Citer : Posté le 09/06/2022 16:41 | #


Note : j'ai trouvé une "jolie explication" qui va dans ce sens :

intrinsèquement rien ne diffère entre un int *p et un char *c par exemple, il s'agit dans les deux cas de pointeurs, donc une adresse en mémoire (donc non typée). Par contre si on raisonne en terme de :
- qu'est ce qui est de type int ? et bien c'est *p (et non pas p),.
- qu'est ce qui est de type char ? et bien il s'agit de *c (pas c)
d'où le fait qu'il semble en effet plus logique d'accorder le type (int, char, float...) sur ce qui est vraiment typé (donc *p, *c, ...)
Ainsi il devient plus "correct" et surtout moins ambigu d'écrire int *p et char *c
There are only 10 types of people in the world: Those who understand binary, and those who don't ...

Lephenixnoir En ligne Administrateur Points: 24054 Défis: 169 Message

Citer : Posté le 09/06/2022 17:01 | #


Ah oui j'avais oublié ça. C'est même plus général : la définition d'un type en C reflète toujours l'usage de la valeur.

Par exemple, imaginons que tu veux avoir un pointeur f vers une fonction, qui prend en int en argument et renvoie un pointeur vers un int.

Pour utiliser la fonction, tu déréférences le pointeur, ce qui donne *f. Tu peux ensuite appeler cette expression en lui passant un int, ce qui donne (*f)(int) (attention aux priorités). Le résultat est un pointeur, tu peux donc le déréférencer en écrivant *(*f)(int), et là tu obtiens un int. Et donc tu peux en déduire que la façon de déclarer f c'est :

int *(*f)(int);

Mon graphe (16 Jan): (PythonExtra ; fxsdk#11 ; gint#27 ; (Rogue Life || HH2) ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 53 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd