CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Question pointeurs et références

AssassinOfTime
AssassinOfTime
Niveau 5
12 novembre 2005 à 02:09:05

Salut tout le monde, voici mon problème, merci d´avance à ceux qui y réponderont:

Je suis entrain d´apprendre le C++ à l´aide d´un livre, et j´ai trouvé quelque chose que je n´arrive pas à comprendre, ce n´est pas très bien expliqué dans l´ouvrage. Est-ce que vous pouvez m´expliquer comment interpréter les lignes suivantes:

1- int * fonction(int *pointeur): Qu´est-ce que le * après le premier int veut dire?

2- Ayant déclarer une classe Chat, je trouve plus loin dans le code la fonction suivante:
const Chat * const fonction(const Chat * const leChat); (leChat étant un objet je suppose). Je né pas bien compris cette ligne également.

3- const Chat & fonction(const Chat & leChat);

Merci à ceux qui m´aideront, veuillez excuser mon ignorance. :desole:

lag-it
lag-it
Niveau 10
12 novembre 2005 à 11:24:36

1/ int *fonction(int *pointeur);

L´* après le premier int a la même signification que l´étoile après le second int : ta fonction retourne un pointeur sur un entier.
Par exemple :

int *fonction(int *pointeur)
{
return pointeur;
}

2/ const Chat * const fonction(const Chat * const leChat);
Ca fonctionne un peu comme la ligne précédente : ta fonction accepte en paramètres un pointeur et retourne un pointeur.
La difficulté d´interprétation provient ici des "const".
Tu peux les utiliser de 4 manières différentes avec des pointeurs :

:d) Chat *leChat = ...;
C´est un pointeur non constatnt sur une variable non constante, autrement dit tu peux modifier la valeur des données pointées, en déréférencant :

Soient int variable = 2, *entier = &variable;

Tu peux écrire :

  • entier = 3;

Sans problème.

Mais tu peux aussi modifier l´objet vers lequel pointe le pointeur :

Soient int var1, var2, *entier = &var1;

Tu peux écrire :
entier = &var1;
Sans erreur. Autrement dit tu peux changer l´addresse de pointage du pointeur.

:d) const Chat *leChat = ...;

Il s´agit d´un pointeur constant vers de données non constantes, autrement dit tu ne peux plus modifier l´addresse vers laquelle pointe le pointeur (comme avec entier = &var2 avant), mais tu peux quand même modifier la valeur pointée (avec *entier = 3; avant).

Un exemple courant de pointeur constant : les tableaux. Un nom de tableau est en fait uèn pointeur constant vers le premier élément du tableau. Tu peux bien sûr modifier la valeur des éléments, mais pas l´addresse pointée par ce pointeur.

:d) Chat *const leChat = ...;

Il s´agit d´un pointeur non constant sur des données constantes, autrement dit tu peux modifier la valeur pointée par le pointeur en luiaffectant l´addresse d´un objet, mais tu ne pourras pas modifier la valeur des objets par le biais de ce pointeur.

:d) const Chat * const leChat = ...;

Pointeur constant sur des données constantes : tu ne peux ni moidifier l´addresse vers laquelle pointe le pointeur, ni modifier la valeur des objets pointés par le biais de ce pointeur.

3/ const Chat & fonction(const Chat & leChat);

Les références sont une spécificité du C++ qui n´existent pas en C. Ca fonctionne un peu comme les pointeurs, mais en plus simple. Un référence te perrmet en fait de créer un alias d´une variable. Autrement dit dans ta fonction d´exmple, const Chat & leChat signifie en fait que leChat désignera la valeur passée en argument. Si tu n´avait pas mis le &, l´objet aurait été recopié intégralement dans la variable leChat lors de l´appel. Avec la référence, non : leChat désigne la valeur passée en argument elle même.
Ca fonctionne pareil pour la valeur de retour : ta fonction renvoie une référence.
Quand au mot clé const, utilisé à cet endroit il signifie que ta référence est constante, i.e. que tu ne peux pas changer l´"addresse vers laquelle elle pointe".
Le références sont un peu un stade intermédiaire entre les variable et les pointeurs.
L´avantage, c´est que si tu désires créer une fonction qui prends une classe avec beaucoup de variables membre en argument, le passage par référence évite de recopier toutes les valeurs lors de l´appelle de la fonction, ce qui prends énormément de temps.

Et tu n´as pas à t´excuser, il est d´autant plus agréable de répondre à ta question que celle-ci est bien formulée :-)))

lag-it
lag-it
Niveau 10
12 novembre 2005 à 11:26:28
  • "Tu peux écrire :

entier = &var1;
Sans erreur. Autrement dit tu peux changer l´addresse de pointage du pointeur."

Je voulais dire :

"Tu peux écrire :
entier = &var2;
par la suite, sans erreur. Autrement dit tu peux changer l´addresse de pointage du pointeur."

AssassinOfTime
AssassinOfTime
Niveau 5
12 novembre 2005 à 14:41:48

Merci beaucoup mon ami, j´y vois plus clair maintenant. :merci:

AssassinOfTime
AssassinOfTime
Niveau 5
12 novembre 2005 à 15:16:58

euh une dernière chose, ça ne serait pas plutot le contraire? je m´explique:

const Chat *leChat = ...;

Il s´agit d´un pointeur non constant sur des données constantes, autrement dit tu peux modifier la valeur pointée par le pointeur en luiaffectant l´addresse d´un objet, mais tu ne pourras pas modifier la valeur des objets par le biais de ce pointeur.

Chat *const leChat = ...;

Il s´agit d´un pointeur constant vers des données non constantes, autrement dit tu ne peux plus modifier l´addresse vers laquelle pointe le pointeur (comme avec entier = &var2 avant), mais tu peux quand même modifier la valeur pointée (avec *entier = 3; avant).

Un exemple courant de pointeur constant : les tableaux. Un nom de tableau est en fait uèn pointeur constant vers le premier élément du tableau. Tu peux bien sûr modifier la valeur des éléments, mais pas l´addresse pointée par ce pointeur.

lag-it
lag-it
Niveau 10
12 novembre 2005 à 15:27:05

Oui je viens de vérifier, j´ai en effet mélangé les 2 :-)))

LGV
LGV
Niveau 28
12 novembre 2005 à 17:10:11

tout petit complement : le const portant sur les donnes peut "bouger", a gauche ou a droite de la declaration. On peut donc trouver l´ecriture :

Chat const *leChat;

qui est la meme chose que :

const Chat *leChat;

AssassinOfTime
AssassinOfTime
Niveau 5
12 novembre 2005 à 21:19:00

Merci à toi aussi l´ami.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment