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 :

pointeurs et tableaux


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 51
    Points : 36
    Points
    36
    Par défaut pointeurs et tableaux
    Bonjour,

    Avant de poster j'ai recherché à plusieurs endroits mais n'ai pas pu comprendre les tutos pour un point préçis.

    Mon (petit) souçi est une incompréhension entre pointeur et tableau.

    Voici deux lignes de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      int tab[10]={0};
      printf("adresse de tab = %d\n Valeur de tab = %d\n", &tab, tab);
    tab est un pointeur vers son premier élément et donc contient l'adresse de tab[0].
    Bon, si j'exécute les deux lignes ci-dessus, je m'aperçois que j'ai le même résultat , le même emplacement en mémoire (2293568).
    Ce que je ne trouve pas logique: car tab doit bien en effet contenir l'adresse de tab[0] mais &tab devrait renvoyer l'adresse de tab lui-même.

    Merci de vos réponses.

  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
    Citation Envoyé par gauguin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      int tab[10]={0};
      printf("adresse de tab = %d\n Valeur de tab = %d\n", &tab, tab);
    Déjà, une adresse s'affiche avec "%p" qui attend un (void*) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      int tab[10]={0};
      printf("adresse de tab = %p\n"
             "Valeur de tab = %p\n", (void *) &tab, (void *) tab);
    tab est un pointeur vers son premier élément et donc contient l'adresse de tab[0].
    Bon, si j'exécute les deux lignes ci-dessus, je m'aperçois que j'ai le même résultat , le même emplacement en mémoire (2293568).
    Ce que je ne trouve pas logique: car tab doit bien en effet contenir l'adresse de tab[0] mais &tab devrait renvoyer l'adresse de tab lui-même.
    tab n'est pas un objet 'à part'. C'est un objet non modifiable de type pointeur (non-modifiable l-value) dont la valeur est l'adresse du premier élément du tableau :

    tab = tab + 0 = &tab[0]

    Par contre, comme c'est un objet, il a une adresse &tab. Il est donc logique que cette adresse soit la même que celle du premier élément (les deux objets sont confondus). Mais le type de cette adresse est "adresse de tableau" et non "adresse d'élément", ce qui fait qu'il ne sont pas interchangeables.

    http://emmanuel-delahaye.developpez....es.htm#tableau
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, je pense que ton pb vient du printf. %d te permet d'afficher un entier mais si j'ai bonne mémoire l'adresse d'un pointeur n'est pas un entier mais un entier en notation hexadécimale. Ce n'est pas le format %d qu'il faut utiliser mais un autre...que je ne connais pas.

    autre chose : tab et &tab[0] doivent renvoyer le même résultat : l'adresse du tableau (pointeur sur le 1e élément du tableau). tu as marqué &tab ce qui me parait un peu bizarre (je pense)

  4. #4
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Bah non "&tab == tab", c'est normal

  5. #5
    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
    Citation Envoyé par Gruik
    Bah non "&tab == tab", c'est normal
    Comme je l'ai expliqué, la valeur est la même (et encore uniquement parce que c'est +0) mais le type est différent.

    &tab+1 n'est pas tab+1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    int main (void)
    {
       int tab[4];
     
       printf ("tab  =%p &tab  =%p\n", (void *) tab, (void *) &tab);
       printf ("tab+1=%p &tab+1=%p\n", (void *) (tab + 1), (void *) (&tab + 1));
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tab  =0022FF60 &tab  =0022FF60
    tab+1=0022FF64 &tab+1=0022FF70
     
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    ZUt, il y a un truc qui n'arrive pas au cerveau :
    Tu écris
    Par contre, comme c'est un objet, il a une adresse &tab. Il est donc logique que cette adresse soit la même que celle du premier élément (les deux objets sont confondus). Mais le type de cette adresse est "adresse de tableau" et non "adresse d'élément", ce qui fait qu'il ne sont pas interchangeables.
    Je ne trouve pas ça logique que ce soit la même car il faut bien un emplacement en mémoire pour stocker &tab[0] (donc la rvalue de tab), et c'est cet emplacement que je pensais trouver avec &tab.

    valeur---:----|--adresse de tab[0]--|-----0-----|-----0--------|......
    variable---:------------tab--------------tab[0]-------tab[1]----
    adresse---:--------------? ------------2293568-----2293572---

    merci.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Oups, je crois que j'ai compris

    le premier élément est en tab
    Donc tab et tab[0] sont un même et unique élément.

  8. #8
    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
    Citation Envoyé par gauguin
    Oups, je crois que j'ai compris



    Donc tab et tab[0] sont un même et unique élément.
    Non ce sont deux objets au même emplacement. Leurs type (et leur tailles) sont différents.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tab    : |---------------|
    tab[0] : |---|
    tab[1] :     |---|
    tab[2] :         |---|
    tab[3] :             |---|
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 51
    Points : 36
    Points
    36
    Par défaut
    Ok, après une dure réflexion, je vois grâce aux excellentes explications.
    En fait tab et tab[0] sont différents par leurs type est taille mais résident
    au même emplacement.
    C'est pour cette raison que tab+1 (qui pointe sur tab[0] ) donne l'adresse du deuxiéme élément et &tab+1 (type tableau - vu comme le tableau dans son ensemble) donne l'adresse de l'élément suivant le dernier élément du tableau.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 10/10/2007, 10h09
  2. [LabView 8.2] Pointeur de tableaux pour des dll
    Par Grumot dans le forum LabVIEW
    Réponses: 2
    Dernier message: 03/10/2007, 13h18
  3. Réponses: 27
    Dernier message: 24/05/2007, 23h29
  4. Pointeurs et tableaux
    Par sebdu94 dans le forum C
    Réponses: 4
    Dernier message: 22/03/2007, 16h27
  5. Réponses: 12
    Dernier message: 03/01/2006, 17h23

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