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 :

qu'est ce que c'est ? *(int *)a;


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Novembre 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 75
    Par défaut qu'est ce que c'est ? *(int *)a;
    salut à tous, voilà j'ai un probleme, je n'arrive pas à comprendre ce ceci:
    *(int *)a; pouvez vous m'eclairssir là-dessus ? je l'ai vu en cherchant des infos sur la fonction qsort, dans cette fonction qsort se trouve un appel à une fonction compare et c'est dans la fonction compare que j'ai vu cette ligne.
    pour etre claire voici un lien où trouver cette fonction qsort pour ceux qui ne l'ont pas encore vu : http://www.cplusplus.com/ref/cstdlib/qsort.html
    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Salut,

    a est un pointeur sur n'importe quoi (void *).

    Or on travaille sur des entiers, donc on veut que a soit un pointeur d'entier.
    On cast donc a,
    a devient donc un pointeur d'entier

    Puis on accède à la valeur pointée par a grçace à l'opérateur *

    *(int *)a renvoie la valeur pointé par a (un int).

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int compare (const void * a, const void * b)
    {
      return ( *(int*)a - *(int*)b );
    }
    Ici les argument sont des pointeur générique donc en fait il faut caster les donner dans leur type d'origine pour pouvoir effectuer une comparaison, ce qu'on fait avec:
    vu qu'il s'agit d'un pointeur.

    Ensuite, pour récupérer la valeur stockée par un pointeur tu le fait naturellement comme ceci

    Tu entrevois la chose ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre actif
    Inscrit en
    Novembre 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 75
    Par défaut
    Ah ok, si je comprends bien, dans le cas où on aurait plutot declaré compare comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int compare ( const int *a,const int *b)
    {
      return (*a - *b);
    }
    ?
    et donc on juste convertir le pointeur generique void* en un pointeur d'entier ?

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par salif98
    Ah ok, si je comprends bien, dans le cas où on aurait plutot declaré compare comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int compare ( const int *a,const int *b)
    {
      return (*a - *b);
    }
    ?
    et donc on juste convertir le pointeur generique void* en un pointeur d'entier ?
    Oui
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sauf que le (int*) peut convertir n'importe quoi en pointeur d'entier.
    En C, je trouve qu'il est plus propre d'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int compare ( void const * pcgA, void const * pcgB)
    {
    int const * pcA = pcgA;
    int const * pcB = pcgB;
     
    return (*pcA - *pcB);
    }
    Ici en C, aucun cast n'est nécessaire, donc aucun risque changement intempestif de niveau d'indirection...
    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
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc
    En C, je trouve qu'il est plus propre d'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int compare ( void const * pcgA, void const * pcgB)
    {
    int const * pcA = pcgA;
    int const * pcB = pcgB;
     
    return (*pcA - *pcB);
    }
    Ici en C, aucun cast n'est nécessaire, donc aucun risque changement intempestif de niveau d'indirection...
    +1

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Ici en C, aucun cast n'est nécessaire, donc aucun risque changement intempestif de niveau d'indirection...
    Ah? Ceci n'est pas un changement intempestif de niveau d'indirection?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int compare ( void const * pcgA, void const * pcgB)
    {
    int const ** pcA = pcgA;
    int const * pcB = pcgB;
     
    return (**pcA - *pcB);
    }

Discussions similaires

  1. est-ce que python est ce que je cherche
    Par SILICONE dans le forum Général Python
    Réponses: 5
    Dernier message: 21/12/2007, 14h23
  2. Qu'est ce que c'est qu'un Trigger ?
    Par shingo dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/10/2003, 22h09
  3. Un daemon qu'est ce que c'est exactement ?
    Par CedricYhuel dans le forum Administration système
    Réponses: 5
    Dernier message: 01/08/2003, 11h56
  4. Qu'est ce que c'est : Le GateA20 ?
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 24/02/2003, 15h09
  5. Qu'est-ce que c'est que Nessus, ça fait quoi exactement ?
    Par PeterT dans le forum Développement
    Réponses: 3
    Dernier message: 24/07/2002, 11h23

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