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

Bibliothèque standard C Discussion :

Détermination d'une position dans un tableau


Sujet :

Bibliothèque standard C

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut Détermination d'une position dans un tableau
    Bonjour à tous,

    soit le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <STDIO.H>
     
    int main (int argc, char *argv[])
    {
       int i = 1;
       int tab[] = { 1, 2, 3 };
     
       printf("tab[i] = %p - %d\n", &tab[i], tab[i]);
       printf("i[tab] = %p - %d\n", &i[tab], i[tab]);
     
       return 0;
    }
    Comment se fait-il que et aient la même adresse (et donc le même contenu) ?
    Il y a t-il un document qui décrit ce comportement ? La manière dont est déterminé la position dans un tableau ?
    Stay in touch

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    on s'en rend mieux compte comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int main (void)
    {
       int i = 1;
       int tab[] = { 1, 2, 3 };
     
       printf ("tab[i] = %p - %d\n", (void*) (tab + i), tab[i]);
       printf ("i[tab] = %p - %d\n", (void*) (i + tab), i[tab]);
     
       return 0;
    }
    dans le deuxième printf(), tu considères i non plus comme un entier mais comme l'adresse 1 auquel tu ajoutes l'adresse de tab, ce qui est équivalent à l'adresse de tab augmenté de 1. Néanmoins, je me demande si le comportement n'est pas indéterminé...
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Au début je n'avais pas bien compris ton explication, mais je pense que ça va mieux:

    -tab = &tab[0]
    -tab + i équivaut donc à &tab[0] + i

    J'aurais envie de rajouter que:
    &tab[0] + i vaut en réalitée &tab[0] + (i * sizeof(int))

    C'est juste ?
    Stay in touch

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je dirais plutôt que ça vaut en réalité :
    (int *)( ((char *)&tab[0]) + (i * sizeof(int)) )
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Globalement je suis d'accord, mais ton (int *) ne devrait pas plutôt être un (long *) ?
    Stay in touch

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Puisqu'on bosse avec des tableaux de int, je ne vois pas pourquoi...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    mais l'expression détermine une adresse, pourquoi la représenter par un int ?
    Stay in touch

  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 oLie93 Voir le message
    Comment se fait-il que et aient la même adresse (et donc le même contenu) ?
    Il y a t-il un document qui décrit ce comportement ? La manière dont est déterminé la position dans un tableau ?
    C'est une conséquence de l'arithmétique des pointeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &tab[i] = tab + i = i + tab = &i[tab]
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par oLie93 Voir le message
    mais l'expression détermine une adresse, pourquoi la représenter par un int ?
    Où as-tu vu que je la représentais par un int ?
    Je la représente par un pointeur sur char, je l'incrémente, puis je la retransforme en pointeur sur int...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Où as-tu vu que je la représentais par un int ?
    Je la représente par un pointeur sur char, je l'incrémente, puis je la retransforme en pointeur sur int...
    Soit.

    Mais est-ce bien utile de savoir que l'on pointe sur un int alors qu'on souhaite simplement consulter son adresse et pas son contenu ?
    A la réflexion, ma remarque sur le (long *) n'est pas jusitifée -et est effectivement fausse- , autant rester en (void *) comme l'a fait nicolas.sitbon dans sa réponse au début, non ?
    Stay in touch

  11. #11
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par oLie93
    Il y a t-il un document qui décrit ce comportement ? La manière dont est déterminé la position dans un tableau ?

    D'après la norme que j'ai (Committee Draft — August 3, 1998 http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n843.htm), mais a mon avis ça ne date pas de cette révision
    Citation Envoyé par 6.5.2.1 Array subscripting
    1- constraint
    One of the expressions shall have type ‘‘pointer to object type’’, the other expression shall
    have integer type, and the result has type ‘‘type’’.

    2- semantics
    [...]
    The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par D[r]eadLock Voir le message
    D'après la norme que j'ai (Committee Draft — August 3, 1998 http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n843.htm), mais a mon avis ça ne date pas de cette révision
    La classe, merci
    Stay in touch

  13. #13
    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 D[r]eadLock Voir le message
    D'après la norme que j'ai (Committee Draft — August 3, 1998 http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n843.htm), mais a mon avis ça ne date pas de cette révision
    Ton document est très ancien. On en est au TC3 :

    http://www.open-std.org/jtc1/sc22/wg...docs/n1256.pdf
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ton document est très ancien. On en est au TC3 :

    http://www.open-std.org/jtc1/sc22/wg...docs/n1256.pdf
    merci de ton amabilité !!
    Stay in touch

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

Discussions similaires

  1. Récupérer position relative d'une cellule dans un tableau
    Par c.piette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/04/2015, 14h22
  2. Afficher une position dans un tableau
    Par Cannot dans le forum Débuter
    Réponses: 7
    Dernier message: 30/12/2012, 21h43
  3. Réponses: 2
    Dernier message: 06/09/2012, 10h37
  4. Réponses: 3
    Dernier message: 20/03/2012, 06h33
  5. Réponses: 3
    Dernier message: 06/04/2006, 16h09

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