Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeurs Langage C

Subtilités ?

    17 juin 2022 à 14:21:19

    Bonjour à toutes et à tous. 

    Je suis en train de suivre le cours sur le langage C. 

    Et je me demande s'il y a une subtilité que je n'ai pas comprise. 

    Pourquoi nous utilisons un pointeur en paramètre de la fonction "triplePointeur" et pas simplement une variable de type int ? 

    A ce moment là, corrigé moi si j'ai mal compris. L'ordinateur crée un pointeur de type int et stock la valeur 3. C'est à dire que nous avons une valeur à l'intérieur du pointeur et non une adresse. Alors pourquoi avoir utilisé un pointeur ? A quoi peut bien nous servir ce pointeur avec une valeur stockée ? Cela permet-il de sauvegarder la valeur après l'utilisation de la fonction ? 

    Merci de m'éclairer.

    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2022 à 14:35:55

      Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).
      -

      Pierre-AntoineDumond2 a écrit:

      A ce moment là, corrigé moi si j'ai mal compris. L'ordinateur crée un pointeur de type int et stock la valeur 3. C'est à dire que nous avons une valeur à l'intérieur du pointeur et non une adresse.

      non, car quand tu écrits *pointeurSurNombre = x; ce n'est pas dans le pointeur que tu mets x mais à l'adresse ou il pointe (qui ici est celle passé en paramètre de la fonction, l'adresse de nombre).  C'est ce que demande de faire l'opérateur d'indirection '*' positionné avant le pointeur.

      Résumé :

      Quand tu écrits pointeurSurNombre = p;  C'est le pointeur que tu modifies,

      et quand tu écris *pointeurSurNombre = x;  C'est le contenu de la mémoire à l'adresse ou il pointe que tu modifies.

      -
      Edité par rouIoude 17 juin 2022 à 14:37:18

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        17 juin 2022 à 15:12:49

        rouIoude a en partie répondu à tes questions.

        Sinon, la réponse à ta question "Pourquoi nous utilisons un pointeur en paramètre de la fonction "triplePointeur" et pas simplement une variable de type int ?" est : pour la même raison que lorsque tu veux que scanf() modifie la valeur stockée dans une variable de type int (en y mettant ce qui est tapé au clavier) tu passes l'adresse de la variable.

        La fonction peut travailler de manière indirecte sur le contenu présent à l'adresse mémoire passée avec l'opérateur d'indirection, comme l'a expliqué rouIoude.

        Si fais une fonction à laquelle tu passes un int, au lieu de l'adresse de la variable int, tu passeras à la fonction une copie du contenu de la variable existante dans main, et l'opération de multiplication faite dans la fonction se fera sur la copie locale à la fonction.

        • Partager sur Facebook
        • Partager sur Twitter
          17 juin 2022 à 18:41:04

          Normalement, on ne peut pas retourner plus d'une valeur pour une fonction.
          Exemple:Échanger deux valeurs:
          void exchange(int *a, int *b) {
              int t = *a;   // Le contenu de a va dans t
              *a = *b;   // le contenu de b va dans le contenu de a  (les adresses ne sont pas changées)
              *b = t;   // t est une variable locale.
          }

          -
          Edité par PierrotLeFou 17 juin 2022 à 18:43:27

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            17 juin 2022 à 22:00:33

            Pierre-AntoineDumond2 a écrit:

            Pourquoi nous utilisons un pointeur en paramètre de la fonction "triplePointeur" et pas simplement une variable de type int ? 

            Pour la simple et bonne raison qu'en passant une simple variable de type int en paramètre, la fonction créera une copie de la variable et appliquera les modifications sur cette copie. Or le but ici est de modifier directement la variable et non pas une copie de celle-ci, d'où la nécessité d'utiliser un pointeur.

            Pierre-AntoineDumond2 a écrit:

            A ce moment là, corrigé moi si j'ai mal compris. L'ordinateur crée un pointeur de type int et stock la valeur 3. C'est à dire que nous avons une valeur à l'intérieur du pointeur et non une adresse. 

            Faux et archi-faux ! En réalité voici ce qui ce passe.

            void triplePointeur(int *pointeurSurNombre) // 1
            {
                *pointeurSurNombre *= 3; // 2
            }

            1. La fonction prend en paramètre un pointeur. Le pointeur en question sera l'adresse de ta variable nombre dans le main. Disons par exemple que ta variable nombre est stockée à l'adresse numéro 310 en mémoire (c'est juste un exemple). Ta variable nombre aura donc les caractéristiques suivantes : Adresse = 310 et valeur = 5. J'espère que tout est clair jusqu'ici.

            Lorsque plus tard dans le main tu feras triplePointeur(&nombre) c'est l'adresse de ta variable nombre (ici 310) qui sera passée.

            2. Viens ensuite le 

            *pointeurSurNombre *= 3;

            Ce que fait cette ligne c'est qu'elle dit à ton ordinateur : Récupères la valeur stockée à l'adresse indiquée (ici 5) et multiplie là par 3, et non pas stockes la valeur 3 dans le pointeur comme tu sembles le croire. Ainsi, ta variable nombre devient égale à 5 * 3 = 15.

            Comme tu peut le voir, on n'a pas eu besoin de faire un return pour modifier la valeur de la variable nombre. Il a suffit de passer son adresse à la fonction triplePointeur() et celle-ci a directement modifié sa valeur. C'est donc là que réside tout l'intérêt des pointeurs.

            • Partager sur Facebook
            • Partager sur Twitter
              18 juin 2022 à 13:33:03

              Ah oui d'accord ! Je comprends beaucoup mieux! C'est à l'appel de la fonction qu'on indique l'adresse de la variable ou l'on veut intervenir en indiquant "&" !

              En vous remerciant pour vos réponses !

              • Partager sur Facebook
              • Partager sur Twitter

              Pointeurs Langage C

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown