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 :

Petites Questions de Compréhension


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut Petites Questions de Compréhension
    Bonjour à vous,

    En refaisant les annales de C, je suis tombé sur un exercice simple mais qui comporte des notations que je ne comprends pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int t[4][3]={{4,6,12},{1,7,11},{10,5,21},{3,9,2}};
        int u[4]={1,2,3,4};
        int *p = &t[1][2], *q = &t[3][1];
        int *x = t[1], *y = t[2];
        int (*a)[3] = &t[1], (*b)[3]=&t[2];
        printf(" %d \n",**t+3+1);// Je ne vois pas à quoi ca correspond ?
        printf("%d \n ", y - x); // non plus
    En effet, **t+3+1 me renvoie 8 (qui ne correspond à aucune valeur ) et y - x me retourne 3...

    2 pointeurs sur int ne devrait pas etre séparé par 4 cases en mémoire (ou ca n a aucun rapport) ?

    Enfin, l'expression que je ne reconnais meme pas à défaut de ne pas la comprendre...

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    **t+3+1:

    si tu remplace de manière logique sa donne:
    **t=premiere case de ton tableau soit la valeur '4'
    4+3+1=8

    ensuite pour y-x:

    y=&t[2] donc (&int)*3 donc (int*)*3 donc 12
    x=&t[1] donc (&int)*2 donc (int*)*2 donc 8

    y-x=12-8 donc 4 soit la taille d'un int*

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Déja merci de prendre le temps de répondre, c'est sympatoche.

    Ensuite, pour y = &t[2] et x = &t[1] , tu résonnes en te disant que t[0] prend 4 cases, t[1] 4 et t[2] 4 donc 3 * 4 = 12 ? (J'essaie de comprendre... )

    Donc dans ce cas, pourquoi mon codeBlocks me renvoie 3 ?!

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par skeud Voir le message
    y=&t[2] donc (&int)*3 donc (int*)*3 donc 12
    x=&t[1] donc (&int)*2 donc (int*)*2 donc 8

    J'ai mis du temps à comprendre !!
    Pour être plus clair,
    (int*)*3
    veut dire
    sizeof(int)*3
    y est l'adresse de la 3e case du tableau.
    x est l'adresse de la 2e case du tableau.
    Vu qu'une case vaut 4 octets, la différence est donc de 4.
    Pourquoi C::B retourne 3 ? bonne question !

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Bon en tout cas si ca retombe, je le saurais...
    Merci les gens

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int t[4][3]={{4,6,12},{1,7,11},{10,5,21},{3,9,2}};
    ...
        int *x = t[1], *y = t[2];
    ...
        printf("%d \n ", y - x); // non plus
    Donc dans ce cas, pourquoi mon codeBlocks me renvoie 3 ?!
    t est un tableau composé d'éléments (4 éléments) qui sont des tableaux de 3 int.
    La différence entre deux adresses, x et y, donne le nombre d'objets qui sépare les deux adresses (pas le nombre de bytes).
    x contient l'adresse du deuxième élément de t et y l'adresse du troisième élément de t.
    Ici ces objets sont des int (puisque x et y sont des int*) et 3 int (un élément de t) sépare les 2 adresses : Le résultat est 3

    Le résultat serait le même, 3, pour tout autre type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type t[4][3];
    type *x = t[1], *y = t[2];  // y-x ==3

    2[t][3]
    Il faut savoir que t[n] est équivalent *(t+n) ce qui est équivalent à *(n+t) qui donc peut aussi s'écrire n[t]
    Alors 2[t] == t[2] :

    t[2][3] == *(t[2]+3) == *(*(t+2)+3) == *(*(2+t)+3) == *(2[t]+3) == 2[t][3]
    ou encore *(2[t]+3) == *(3+2[t]) == 3[2[t]]

    Remarque : cet élément n'existe pas pour le tableau t[4][3], le deuxième indice est limité à 0, 1 ou 2.

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Merci bien Diogene...
    C'est carrément plus clair maintenant.

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Pardon de revenir sur le sujet, mais si j'avais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int (*a)[3] = &t[1], (*b)[3] = &t[2] ;
    La différence de b - a devrait me donner le même résultat puisqu'il s'agit encore de 2 adresses ? donc le nombre d'objet les séparants d'où 3... ?

    Ou alors, a est un pointeur qui pointe sur un tableau de 3 entiers, de même pour b, donc la différence entre les 2 est 1 car les objets en question sont des tableaux de 3 entiers ?

    Merci d'avance.

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    C'est la deuxième solution qui est valide : la réponse est 1. L'objet pointé par a ou b n'est plus un int comme précédemment mais un tableau de 3 int.

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Alors j'ai pigé...
    Merci encore à tous

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

Discussions similaires

  1. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  2. [CR8.5] petite question ..
    Par mcrocher dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/09/2004, 15h04
  3. Une petite question
    Par Etienne1 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/08/2004, 16h19
  4. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 16h35
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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