Partage
  • Partager sur Facebook
  • Partager sur Twitter

pourquoi un pointeur sur char fait une string?

Sujet résolu
    1 avril 2021 à 12:36:38

    Bonjour!

    je pense que la question est assez claire merci d'avance 

    mais une chose a ajouter je demande ca car quand je vois const char* il n'est pas dans un tableau.

    au revoir!

    -
    Edité par LeQuaranteQuatre 1 avril 2021 à 12:38:09

    • Partager sur Facebook
    • Partager sur Twitter
      1 avril 2021 à 13:13:56

      LeQuaranteQuatre a écrit:

      pourquoi un pointeur sur char fait une string?

      je pense que la question est assez claire

      Non pas du tout !

      Un pointeur sur char est un pointeur destiné à pointer sur un char. Ça ne s'utilise que rarement en C++ mais plutôt en C.

      Une std::string c'est type d'objet pour manipuler les chaînes de caractère en C++.

      LeQuaranteQuatre a écrit:

       quand je vois const char* il n'est pas dans un tableau.

      Je ne comprend pas ! Le seul lien entre const char* et un tableau, est qu'une variable de type const char* peut pointer sur un tableau de char ! Mais ça c'est plutôt destiner au langage C !

      • Partager sur Facebook
      • Partager sur Twitter
        1 avril 2021 à 14:12:52

        Une chaîne de caractère, c'est un ensemble de caractères, plus exactement une séquence (mot non choisi au hasard). Plus un moyen de savoir quand elle se termine.

        Il y a plusieurs façons pour modéliser cela. La façon privilégiée en C++, c'est le type std::string. Il correspond à une séquence de caractères, et en plus il fait abstraction que quand on dit plusieurs, on sous-entend toujours gestion de la mémoire associée (il faut savoir où ces plusieurs sont stockés).

        En C, on n'avait pas ce type. Le mieux, c'est les tableaux de caractères. On pouvait avoir soit de vrais tableaux (pile (stack), ou zone de mémoire globale), soit demander l'obtention d'un certain nombre de bytes sur le tas (heap). Et après, libre à nous de décider comment on veut interpréter ces bytes. Pour les chaînes, on veut interpréter ces bytes comme des caractères. Dans tous les cas, on obtient alors un pointeur sur le premier caractère du tableau. Et cela tombe bien, un pointeur peut modéliser deux choses: l'adresse d'un seul élément. Ou l'adresse du premier élément d'une séquence contiguë d'éléments. (Indépendamment, il  y les problématiques de savoir si le pointeur est une vue ou s'il est responsable de la mémoire adressée. Ca serait trop facile sinon)

        Rajoutons à cela qu'en C on ne peut pas passer un tableau en paramètre, mais seulement l'adresse du premier (ou autre) élément d'un tableau.  Les types T* sont les types pour partager des tableaux. Et donc "char*" pour une chaîne modifiable, "char const*" pour une chaîne non modifiable.

        Reste la longueur.  Trois approches:
        - la chaîne est 0- terminée (ex: std::strcpy)
        - on dispose d'un entier correspondant à la longueur de la chaîne  (ex: std::memcpy, std::copy_n)
        - on dispose d'un autre pointeur, qui contient l'adresse de l'élément juste après le dernier élément de la chaîne (ex: std::copy)

        (et potentiellement on a un autre marqueur/entier pour connaître la quantité de mémoire que l'on peut exploiter pour cette chaîne...)

        Et si tu trouves que c'est trop compliqué, soit le bienvenu. Tu peux dans un premier temps oublier tout ça car nous sommes ici en C++, où le type std::string est parfait et suffisant pour les débutants, et pas que.

        -
        Edité par lmghs 1 avril 2021 à 14:20:50

        • Partager sur Facebook
        • Partager sur Twitter
        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
          1 avril 2021 à 14:41:56

          Bonjour,

          Le C++ connait très bien le concept de tableaux de caractères avec un terminateur. La séquence

          std::string  str = "abcd";

          est tout à fait correcte. A droite du égal on a une chaîne au format "C". Donc qui retourne un pointeur sur des caractères constants terminés par un '\0'. Le type std::string a un constructeur qui sait convertir ce const char* en une chaîne valide.

          On peut aussi écrire:

          const char txt[] = "abcd";

          Là on s'éloigne du C++, c'est du C. On crée un tableau de 5 caractères, mais c'est un tableau du C avec tous ses désagréments. C'est syntaxiquement correct, mais c'est  à éviter.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            1 avril 2021 à 17:26:13

            desolé si la question n'a pas été assez claire...:,(

            je demandais pourquoi un pointeur sur un char (donc un charactere) peut s'initialiser comme une chaine de caracteres alors que le char* pointe sur un seul charactere il me semble

            merci quand meme jai appris des choses!

            -
            Edité par LeQuaranteQuatre 1 avril 2021 à 17:33:46

            • Partager sur Facebook
            • Partager sur Twitter
              1 avril 2021 à 17:38:11

              Tu parles donc des chaînes de caractère du langage C (tu n'est pas tout à fait sur le bon forum), et bien parce que l'on peut lui affecter l'adresse du premier élément du tableau de char qui contient la chaîne de caractère. La fin de la chaîne étant délimité par un caractère spécial '\0'.
              • Partager sur Facebook
              • Partager sur Twitter
                6 avril 2021 à 23:28:43

                Ok merci vous avez répondu ma question!

                meric!

                • Partager sur Facebook
                • Partager sur Twitter

                pourquoi un pointeur sur char fait une string?

                × 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