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 :

compréhension de C pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Par défaut compréhension de C pointeurs
    Bonjour

    J'ai vu dans un texte (ooc) un code que je ne comprend pas bien ?

    Quelqu'un pourrait-il m'expliquer ?

    le code problématique est en bleu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void * new (const void * _class, ...) {	
    	const struct Class *class = _class;
    	void *p = calloc(1, class->size);
    	assert(p);
    	*(const struct Class **) p = class;
     	if (class -> ctor != 0)
    	{	va_list ap;
    		va_start(ap, _class);
    		p = class -> ctor(p, & ap);
    		va_end(ap);
    	}
    	return p;
    }
    qu'est ce que change dans le pointeur p après cette ligne ?

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    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 485
    Par défaut
    Bonjour et bienvenue !

    L'expression entre parenthèses est un transtypage (ou cast). Elle sert à indiquer au compilateur que ce qui suit (ici, la valeur de p) doit être considérée comme ce qui est décrit. Donc

    p : la valeur de p (que l'on sait être un pointeur, déjà) ;
    (const struct Class **) p : ce pointeur est ici considéré comme un « pointeur sur un pointeur sur une structure Class » ;
    * (const struct Class **) p : l'opérateur de déréférencement. On se rapporte non pas à « p » lui-même, mais à ce qu'il pointe. Donc, ici, l'autre pointeur, censé pointer une structure Class.

    En fait, la mémoire allouée un peu plus haut est censée contenir un tableau de pointeurs. Et ce tableau est lui-même pointé par la valeur retournée par malloc(). L'expression sert donc à remplir ce tableau.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    En fait, la mémoire allouée un peu plus haut est censée contenir un tableau de pointeurs. Et ce tableau est lui-même pointé par la valeur retournée par malloc(). L'expression sert donc à remplir ce tableau.
    Le calloc n'est que d'un élément donc remplir le tableau est en fait juste copier un élément.

    Je ne vois la différence de ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void *p = calloc(1, class->size);
    *(const struct Class **) p = class;
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const struct Class * p = calloc(1, class->size);
    p = (const struct Class *) class;
    En fait, le code tout entier est obscur pour moi

    Pourquoi passer _class en paramètre que contient-il ? Le caster en pointeur constant sur une structure Class permet de correctement accéder aux éléments de la structure si je ne m'abuse. Dans ce cas, quel intérêt de passer _class comme pointeur sur void et non sur struct Class ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    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 485
    Par défaut
    À première vue, ça ressemble à du code auto-généré, à partir d'un langage objet et de ses paradigmes les plus courants.

    Soit on passe de manière explicite des choses comme this en tant que premier paramètre, comme en Python, soit c'est une instance toujours valide de l'objet à traiter, pour pouvoir gérer les membres statiques et/ou les « traits » constants d'une classe (comme, ici, sa taille).

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Par défaut
    Merci

    cela est déja un peu plus clair!!

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2012
    Messages : 10
    Par défaut
    * (const struct Class **) p : l'opérateur de déréférencement. On se rapporte non pas à « p » lui-même, mais à ce qu'il pointe. Donc, ici, l'autre pointeur, censé pointer une structure Class.
    une autre question !

    le pointeur p étant un pointeur de type void, comment peut-il être déréférencé ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/03/2015, 23h42
  2. Problème de compréhension d'un exercice sur les pointeurs
    Par neufrdb dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 28/05/2011, 23h58
  3. Compréhension des pointeurs
    Par tealc_210 dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2009, 20h30
  4. Réponses: 17
    Dernier message: 22/01/2007, 13h34
  5. Pb de compréhension pointeur
    Par marcoss dans le forum C
    Réponses: 7
    Dernier message: 01/01/2007, 20h52

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