IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Difference entre un pointeur et un tableau de chaine de caractères


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut Difference entre un pointeur et un tableau de chaine de caractères
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdio.h>
    #include <string.h>
     
    typedef struct label 
    {
    	char nom[5];
    	char *nom_pt;
    }struc;
     
    void main (void)
    {
    	struc premier;
     
    	premier.nom_pt = "haha";
    	strcpy(premier.nom,"hehe");
     
    }

    je me demandais pourquoi , pour bien cerner la difference entre pointeur et tableau pourquoi on a pas le droit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    premier.nom = "heho"
    directement il ne veux pas compiler, je pense que c'est logique mais je ne comprends pas bien pourquoi
    malgres que j'ai lu plusieurs tutoriaux sur la chose

    Voila merci

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: difference entre un pointeur et un tableau de chaine de
    Citation Envoyé par bonjour69
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <string.h>
     
    typedef struct label 
    {
    	char nom[5];
    	char *nom_pt;
    }struc;
     
    void main (void)
    main() retourne int. Toujours.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
    	struc premier;
     
    	premier.nom_pt = "haha";
    	strcpy(premier.nom,"hehe");
    }
    je me demandais pourquoi , pour bien cerner la difference entre pointeur et tableau pourquoi on a pas le droit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    premier.nom = "heho"
    Déjà, pour l'exemple, il n'était pas nécessaire d'alourdir le code avec une structure. Deux variables simples auraient suffit.

    Ensuite. Un pointeur est une variable. Il est donc tout à fait légitime de lui donner une valeur (qui est une adresse) en utilisant le nom d'un tableau.

    En effet, le nom d'un tableau est une constante qui a la même valeur et le même type que l'adresse du premier élément du tableau.

    Etant une constante, il n'est évidemment pas possible de le modifier, d'où l'impossibilité d'affecter directement un tableau avec un autre. Il faut soit copier en bloc avec memcpy(), soit copier chaque élément un par un avec une boucle.

    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Bonjour

    Parce que "nom" désigne en fait &nom[0]. Or, un tableau n'est pas un pointeur. Le signe d'affectation "=" est interprété comme "faire pointer sur". Le tableau automatique n'étant pas un pointeur, il ne peut pas pointer sur une chaine constante. Par contre, cette écriture marche avec un pointeur.
    Je ne sais pas si c'est le genre de réponse que t'attends ou si tu veux quelque chose de plus poussé.

    Nas'

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut Re: difference entre un pointeur et un tableau de chaine de
    Citation Envoyé par Emmanuel Delahaye
    En effet, le nom d'un tableau est une constante qui a la même valeur et le même type que l'adresse du premier élément du tableau.
    Tu sais que c'est faux.

    J'ai horreur de cette presentation des choses qui a pas mal d'inconvenients. Considerons le contexte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tab[10];
    int mat[10][10];
    int (*ptr)[10];
    • ca n'explique pas le comportement de sizeof(tab)
    • ca n'explique pas le comportement de &tab
    • ca n'explique pas le comportement de *ptr et mat[1] qui se conduisent pourtant exactement comme tab dans tous les contextes et l'explication correcte permet d'expliquer tout directement
    • ca augmente la confusion entre tableau et pointeur comme s'il n'y avait deja pas assez de raisons comme ca d'etre confu
    • il y a peut-etre d'autres problemes plus subtils (j'en vois pas en C pour le moment, j'en vois bien en C++)


    Edit: j'oubliais la vraie explication pour ceux qui ne la connaisse pas: Toute expression de type "array de type" (et pas uniquement les noms de variables) est convertie dans la plupart des contextes en une expression de type "pointeur vers type" pointant vers le premier objet du tableau. Les cas les plus courants ou ca n'arrive pas c'est apres sizeof et &.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Pour moi, cette notation est plus claire.
    ptr est un tableau de 10 pointeurs sur int.

    Juste ?

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Nico_stras
    Citation Envoyé par Jean-Marc.Bourguet
    Pour moi, cette notation est plus claire.
    ptr est un tableau de 10 pointeurs sur int.

    Juste ?
    Il y a une difference importante entre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int (*p1)[10];
    int* p2[10];
    p1 est un pointeur vers un tableau de 10 int, p2 est un tableau de 10 pointeurs vers int.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    effectivement, pas du tout pareil !!

    et p1 ne peut pas être assimilé à un tableau (sizeof(p1)=4, soit la taille d'un pointeur)

    J'apprends vraiment plein de choses aujourd'hui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         char* p2[10] ;
         char *p3[10] ;
    Quelle notation préfères-tu ? pourquoi ? Je n'ai jamais compris les arguments des uns et des autres.

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Nico_stras
    effectivement, pas du tout pareil !!

    et p1 ne peut pas être assimilé à un tableau (sizeof(p1)=4, soit la taille d'un pointeur)

    J'apprends vraiment plein de choses aujourd'hui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         char* p2[10] ;
         char *p3[10] ;
    Quelle notation préfères-tu ? pourquoi ? Je n'ai jamais compris les arguments des uns et des autres.
    char *p3[10]; est plus proche de la manière dont est interprétée la définition (voir la signification de char *p3[10], c; qui définit un char et un tableau de 10 pointeurs vers char), char* p2[10] est plus proche de la manière dont on réfléchit.

    Les deux formes se rencontrent (et d'autres avec plus ou moins d'espaces, comme char * p4 par exemple), mais en C, la manière de p3 est plus courante, en C++ celle de p2. J'ai une légère préférence pour celle de p2, mais je tends à suivre la majorité (donc a utiliser p3 quand j'écrit du C).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    + 1 avec Jean-Marc... (Quoique je ne puisse dire grand chose sur C++, vu que je l'utilise pas )..

    En C, j'ai toujours tendance à utiliser p3...
    [en fait, pour des raisons de lisbilité aussi : sachant que les étoiles sont les pointeurs, il me semble plus lisible d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char          toto ;
    char         *chaine ;
    int           titi ;
    int         **tutu ;
    Mastruct      MaMienne ;

    Mais j'ai aussi tendance à éviter au maximum de toutes façons les tableaux de pointeurs à dimensions définies.... Donc en général je privilégie les doubles (voire triples) pointeurs....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Points : 89
    Points
    89
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char          toto ;      // toto est de type char
    char*         chaine ;    // chaine est de type pointeur sur char (char*)
    int           titi ;      // titi est de type int
    int**         tutu ;      // tutu est de type pointeur sur pointeur sur int (int**)
    C'est ma manière de raisonner.
    Correct ?

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    La réponse, Jean-Marc te l'a donnée :

    Citation Envoyé par Jean-Marc.Bourguet
    char *p3[10]; est plus proche de la manière dont est interprétée la définition (voir la signification de char *p3[10], c; qui définit un char et un tableau de 10 pointeurs vers char),
    char* p2[10] est plus proche de la manière dont on réfléchit.
    ....
    C'est donc correct ce que tu as mis par rapport à la manière de réfléchir. Mais la manière "d'interprétation" est la notation que j'avais mise..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/11/2014, 00h44
  2. Réponses: 2
    Dernier message: 20/08/2011, 00h32
  3. Pointeur, tableau et chaines de caractères.
    Par rouliane dans le forum C++
    Réponses: 8
    Dernier message: 19/12/2006, 20h27
  4. [C] tableau de chaines de caractères
    Par kitsune dans le forum C
    Réponses: 18
    Dernier message: 01/04/2006, 18h18
  5. difference entre vector, deque, list et tableau
    Par salseropom dans le forum SL & STL
    Réponses: 8
    Dernier message: 03/01/2005, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo