Partage
  • Partager sur Facebook
  • Partager sur Twitter

pointeur

problème compréhension

    20 avril 2006 à 10:44:31

    Bonjour, j'ai un problème dans le chapitre sur les chaines de caractère et les fonctions de manipulation.

    nous avons ce morceau de code


    size_t strlen(const char* chaine);


    et celui là :


    int main(int argc, char *argv[])
    {
        char chaine[] = "Salut";
        long longueurChaine = 0;
        longueurChaine = strlen(chaine);
        printf("La chaine %s fait %ld caracteres de long", chaine, longueurChaine);

        return 0;
    }


    pourquoi nous ne mettons pas :


    longueurChaine = strlen(&chaine);
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 avril 2006 à 10:50:41

      Parce que le nom d'une chaine de caractères (et d'un tableau en général) est converti en pointeur vers la première case automatiquement
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        20 avril 2006 à 11:25:45

        oui, j'ai eu le même problème de compréention que toi: donc j'avais fait un test et j'ai trouver que:

        Qu'il y avait un pointeur avant le tableau de char(chaine de caractere)!

        et j'ai vu que l'adresse du pointeur du tableau de char(chaine de caractere) est egal a sa valeur qui est egal a l'adresse de la 1er case du tableau de char (chaine de caractere).

        c'est comme sa que je me suis représenter un tableau de char(chaine de caractere).Et donc si tu veux donné l'adresse d'un tableau de char (chaine de caractere) tu peux faire comme sa:

        strlen(&chaine); //tu envoie l'adresse du pointeur de la chaine de caractere.

        strlen(chaine); /*tu envoie la valeur du pointeur
        de la chaine de caractere.*/


        strlen(&chaine[0]); /*tu envoie l'adresse de la variable qui est la 1ere case du tableau.*/

        strlen((chaine + 0)); /*tu fait appelle au pointeur de la chaine de caractere et tu lui demande l'adresse de la variable qui est la 1ere case du tableau */
        • Partager sur Facebook
        • Partager sur Twitter
          20 avril 2006 à 14:27:59

          Citation : charly90

          oui, j'ai eu le même problème de compréention que toi: donc j'avais fait un test et j'ai trouver que:

          Qu'il y avait un pointeur avant le tableau de char(chaine de caractere)!


          Ah ? Où ça ? Quand le fait un sizeof, j'ai nombre exact de bytes. Je ne vois pas de pointeur supplémentaire. D'autre part, la valeur de tab est la même que celle de &tab...


          #include <stdio.h>

          int main(void)
          {
             char tab[12];

             printf ("sizeof tab = %u\n", (unsigned) sizeof tab);
             printf ("tab = %p\n", (void*) tab);
             printf ("&tab = %p\n", (void*) &tab);
             return 0;
          }


          En fait, un tableau est un objet assez tordu. C'est une non modifiable L-value.

          Une L-value (diminutif de Left-value) est la partie gauche d'une expression d'affectation.

             int a;
             a = 123;

          a est une [modifiable ]L-value. Par contre, si j'écris

             int const a = 123;

          a est une non-modifiable L-value. C'est un objet muni d'une adresse, donc ce n'est pas une expression constante, mais ce n'est pas non plus une variable modifiable. C'est un peu 'entre les deux'.

             int const a = 123;
             int const *pa = &a;
             int *pb = &a; /* erreur de type */

             *pa = 456; /* ne compile pas (violation de contrainte) */
             *pb = 456; /* comportement indefini */

          Un tableau, c'est un peu pareil :

             int t[10];

          t est un objet non modifiable :

             int t[10];
             t = 123; /* ne compile pas (violation de contrainte) */

          mais il a une adresse, mais attention à ne pas se tromper de type :

             int t[10];
             int *pa = &t; /* erreur de type */
             int (*pb)[9] = &t; /* erreur de type */
             int (*pc)[10] = &t;

          et même au travers de ce type de pointeur, impossible de modifier t :

             int ta[] = {1,2,3 };
             int tb[3];
             int (*pa)[3] = &ta;
             int (*pb)[3] = &tb;

             *pb = *pa; /* ne compile pas (violation de contrainte) */



          • Partager sur Facebook
          • Partager sur Twitter
          Music only !

          pointeur

          × 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