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 :

signification de * lorsqu'il est placé après le terme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut signification de * lorsqu'il est placé après le terme
    Bonjour, voila je suis débutant en C et je souhaiterais connaître la signification de l'opérateur * lorsqu'il est placé après le terme. Pour info je sais qu'il peut soit représenter l'opérateur arithmétique multiplié ou il peut désigner un pointeur.

    Opérateur multiplier: X * Y = XY (jusqu'ici tout va bien!)
    pointeur : *ptr => désigne le contenu de la mémoire située à l'adresse de ptr (la ça va)
    Par contre dans le cas suivant extrait de mon code:

    sourceInfo = &((SourceInstance*)sgInstanceTable.itemTable[index])->sourceInfo;

    dans ce dernier cas à quoi correspond *???

    Merci beaucoup pour vos eclaircissements!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    Citation Envoyé par Seb_33 Voir le message
    sourceInfo = &((SourceInstance*)sgInstanceTable.itemTable[index])->sourceInfo;

    dans ce dernier cas à quoi correspond *???
    C'est bien un pointeur. Il faut en fait lire « (SourceInstance*) ». Les parenthèses forment un transtypage (cast) vers le type « pointeur sur un SourceInstance ».

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Merci beaucoup pour ta réponse!!

    sinon comme je suis un véritable débutant peux tu également me donner des informations sur la syntaxe du reste de la phrase?

    sourceInfo = &((SourceInstance*)sgInstanceTable.itemTable[index])->sourceInfo;

    De ce que je comprends:

    & => adresse de la variable entre parenthèse? c'est à dire de "((SourceInstance*)sgInstanceTable.itemTable[index])"

    Est ce que (SourceInstance*)sgInstanceTable.itemTable[index] se lit:
    (SourceInstance*) X sgInstanceTable.itemTable[index]

    Enfin le caractère -> signifie paraît il : variable pointée donc

    sourceInfo est égale à l'adresse de la variable (SourceInstance*)sgInstanceTable.itemTable[index] qui pointe sur source info??

    Enfin comme tu peux le voir j'y comprends pas grand chose, est ce récupérable?? help please!

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sourceInfo = &((SourceInstance*)sgInstanceTable.itemTable[index])->sourceInfo;
    Tu es confronté à plusieurs notions:
    • les tableaux avec [] (mais ca ne te pose pas de probleme ici)
    • les pointeurs avec "&" et "*"
    • les structures, avec "."
    • les pointeurs de structures, reconnaissables à l'emploi de "->"


    Ici, SourceInstance est un type (que je devine être une structure)
    J'imagine que le type SourceInfo est celui du champ sourceInfo des structures SourceInstance.

    Supposons que la variable si soit un SourceInstance.

    Alors "si.sourceInfo" est un SourceInfo (celui contenu dans si)

    SourceInstance* est un pointeur sur un SourceInstance
    &si est une valeur de ce type.

    sgInstanceTable.itemTable[index] est d'un type arbitraire (celui d'un élément du tableau nommé itemTable, contenu dans la structure sgInstanceTable
    (SourceInstance*)sgInstanceTable.itemTable[index] est cette même valeur, lu comme un SourceInstance* (on dit "convertie en", ou "casté en").
    Les règles de priorité disent en effet que la conversion intervient après l'accès par . et par []

    p->m est l'opérateur "accès au membre m de la structure pointée par p:
    p->m équivaut à (*p).m
    Les priorités sont aussi telles que l'adressage (&a) est moins prioritaire que ->, donc &a->b est en réalité &(a->b) c'est à dire l'adresse du membre b de la structure pointée par a.

    Dans ton cas, on a donc, après parenthésage complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sourceInfo =
    &(
        (
            (SourceInstance*) (sgInstanceTable.itemTable[index])
        )
        ->
        sourceInfo
    );
    J'en déduis que le type de sourceInfo est (const?) SourceInfo* (ou void*, peut-être, mais il manquerait une conversion)

  5. #5
    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
    caractère -> signifie paraît il : variable pointée donc
    a->b : a est un pointeur sur une structure qui contient un champ b
    et a->b permet d'accéder au champ b via l'adresse de la structure.
    Cette expression est équivalente à (*a).b (parenthèses obligatoires) mais plus simple à lire.

    On peut tirer pas mal d'informations avec l'expression sourceInfo = &((SourceInstance*)sgInstanceTable.itemTable[index])->sourceInfo;.
    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sourceInfo = &((SourceInstance*)sgInstanceTable.itemTable[index])->sourceInfo;
    // est de la forme
    sourceInfo = &(x)->sourceInfo
    // équivalente à
    sourceInfo  = &(x->sourceInfo)
    //ou
    sourceInfo  = &x->sourceInfo
    2-
    Alors x est un pointeur sur une structure contenant un champ sourceInfo et x == (SourceInstance*)sgInstanceTable.itemTable[index] .
    A cause du cast, ce pointeur x est du type SourceInstance* donc SourceInstance comporte un champ sourceInfo (d'un type T1 inconnu)

    3-
    Ce cast fait que sgInstanceTable.itemTable[index] est d'un type inconnu, mais probablement un pointeur sur T2 (peut être un void*) ou un entier (j'espère que non, ce serait de la bidouille)
    sgInstanceTable.itemTable est donc un tableau de pointeurs sur T2
    sgInstanceTableest donc une structure (appelons la InstanceTable) comportant un tableau de pointeurs sur T2

    Un exemple qui résume ce que cette expression nous apprend :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <stdio.h>
    typedef int T1 ;  // par exemple
    typedef void T2 ; // par exemple
    typedef struct
    {
       T1 sourceInfo;
       //.....
    } SourceInstance;
     
    typedef struct
    {
       T2 * itemTable[3]; //Il y a aussi la possibilité T2** itemTable;
       //....
    }InstanceTable;
     
    // En global pour initialiser les données de l'exemple
    SourceInstance s1 ={1};
    SourceInstance s2 ={2};
    SourceInstance s3 ={3};
     
    int main(void)
    {
      InstanceTable sgInstanceTable = {&s1, &s2,&s3};
      T1 * sourceInfo ;
      int index = 1 ;
     
      sourceInfo = &((SourceInstance*)sgInstanceTable.itemTable[index])->sourceInfo;
      printf("%d", *sourceInfo);
      return 0;
    }
    qui affiche '2'

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Merci beaucoup d'avoir pris le temps de me répondre et pas à l'arrache en plus! ça fait vraiment plaisir! Bon j'ai quelques notions de bases (je sais ce qu'est un pointeur depuis peu de temps) donc n'ayant pas l'habitude de manipuler ces notions c'est pas hyper simple, en gros je comprends chaque phrase indépendammentn maintenant faut que je fasse le lien entre elles, ça va le faire! après je pense revenir avec des questions

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Citation Envoyé par leternel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sourceInfo = &((SourceInstance*)sgInstanceTable.itemTable[index])->sourceInfo;
    Si j'ai bien compris pour chacun des membres:
    Source instance est une structure contenant le champ sourceInfo
    SourceInstance* est un pointeur de type sourceInstance donc un type structure
    sgInstanceTable est une structure contenant le champ itemTable
    itemTable est un champ de type inconnu contenant lavariable index qui est icic un tableau

    Cependant j'ai du mal à comprendre la notion de type que vous manipulez avec dextérité! Pour moi un type est soit (int ou float ou double ou const ou char). Après une rapide recherche j'ai découvert qu'on pouvait créer des type à sa guise avec "Typedef" c'est ça?

    Vous dites que a -> b signifie que a est un pointeur sur une structure qui contient un champ b, ramener à mon expression cela signifie que:

    SourceInstance* est le pointeur sur la structure sgInstanceTable.item[index] qui contient le champ sourceInfo? si j'ai bien compris se sont les structures qui contiennent des champs, le . signifiant qu'il s'agit d'une structure, je comprends que c'est la structure sgInstanceTable.item[index] qui contient le champ sourceInfo et que cette structure est de type SourceInstance défini par un "Typedef" quelquepart...c'est donc la que je ne suis plus... Et en plus aprèstout ça on rajoute un & devant donc la variable locale sourceinfo reçoit au final une adresse????

    NB: Je pense être perdu dans l'espace intergalactique

Discussions similaires

  1. page blanche apres submit lorsque password est vide
    Par monlou dans le forum Langage
    Réponses: 11
    Dernier message: 21/08/2010, 19h32
  2. Réponses: 9
    Dernier message: 19/12/2005, 16h41
  3. Remplacer une ressource du réseau lorsqu'elle est utilisée
    Par Charette dans le forum Web & réseau
    Réponses: 6
    Dernier message: 22/06/2005, 11h46
  4. Réponses: 3
    Dernier message: 26/02/2005, 09h33

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