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 :

Pointeur sur pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut Pointeur sur pointeur
    Bonjour,
    je n'ai pas d'exemple sous la main pour mieux faire comprendre mon problème (c'est dommage...) mais j'ai du mal à comprendre le passage en paramètre de pointeur sur pointeur.
    Par exemple on a un pointeur et pour modifier se valeur (ou celle pointé par celui-ci je sais pas) je vois parfois qu'il faut passer par un pointeur de pointeur et je ne saisi pas pourquoi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fonction_1(&pointeur);
    ...
    void fonction_1(int **pt)
     
    /* au lieu de */
     
    fonction_2( pointeur);
    ...
    void fonction_2(int *pt)
    Pareil pour les matrices :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fonction_1(&matrice);
    ...
    void fonction_1(int *((*mat)[N])) /* je crois */
     
    /* au lieu de */
     
    fonction_2( matrice);
    ...
    void fonction_2(int (*mat)[N])
    Merci de vos réponses.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Le meilleur exemple que je voie de l'usage d'un pointeur de pointeur, c'est dans l'utilisation d'une fonction d'allocation mémoire.

    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
    void main(void)
    {
       char *pointeur;
       if(MonMalloc(&pointeur, 12) == 1)
       {
          /* erreur d'allocation */
       }
    }
     
    MonFree(&pointer);
     
    int MonMalloc(void **Pointer, int Size)
    {
       /* alloue un pointeur */
       *Pointer = malloc(Size);
       if(*Pointer == NULL)
          return 1;
     
       return 0;
    }
     
    int MonFree(void **Pointer)
    {
       free(*Pointer);
       *Pointer = NULL;
    }
    Dans cet exemple (qui n'est pas complet), on est obligé d'utiliser un pointeur de pointeur dans le paramètre de la fonction pour que l'appelant puisse récupérer le pointeur alloué.

    Pour la fonction MonFree, le fait d'utiliser un pointeur de pointeur permet de liberer le pointeur et en plus de le réinitialiser de manière à ce qu'il ne soit plus utilisable dans le code.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut
    Mais pourquoi ne fait on pas ceci ?
    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>
     
    int MonMalloc(char *Pointer, int Size)
    {
       /* alloue un pointeur */
       Pointer = malloc(Size);
       if(Pointer == NULL)
          return 1;
     
       return 0;
    }
     
    void MonFree(char *Pointer)
    {
       free(Pointer);
       Pointer = NULL;
    }
     
    int main(void)
    {
       char *pointeur = NULL;
       if(MonMalloc(pointeur, 12) == 1)
       {
         return -1;
       }
       MonFree(pointeur);
     
       return 0;
    }

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *pointeur = NULL;
       if(MonMalloc(pointeur, 12) == 1)
    Dans ce cas, le contenu du pointeur est passé par valeur, ce contenu est modifié par la fonction et en quittant la fonction le contenu modifié est perdu.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre Expert
    Avatar de nbenbourahla
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 41
    Par défaut Reponse
    Bonjour
    On peux pas faire ce que tu as car dans ton code tu declare un pointeur char *pointeur = NULL;
    Mais si tu le passe a ta fonction MonMalloc de cette facon :
    MonMalloc(pointeur, 12)
    Ce n'est pas ton pointeur que tu as passer mais une copie (ce qui s'appelle un passage par copie ) et donc dans ta fonction mon malloc c'est ton pointeur que tu malloc mais une copie qui serra detruite a la sortie de la fonction donc ton pointeur ne serra jamais alloué c'est pour sa que le meilleur chose a faire et de passe MonMalloc(&pointeur, 12) (Donc un passage par reference et dans ce cas la c bien ton pointeur que tu modifie et pas une copie)

    de rien

  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
    Par exemple on a un pointeur et pour modifier se valeur (ou celle pointé par celui-ci je sais pas) je vois parfois qu'il faut passer par un pointeur de pointeur et je ne saisi pas pourquoi.
    Ce n'est pas particulier aux pointeurs : si je veux qu'une fonction puisse modifier une grandeur par la liste des paramètres , je dois passer son adresse. Si la fonction connait l'adresse de la grandeur, elle sait où celle-ci est située en mémoire et peut donc y accéder pour la modifier. C'est vrai que la grandeur soit un pointeur ou autre chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void fonction_1(int **pt);
    void fonction_2(int *pt);
    ...
    int I;
    int * pointeur = &I ;
    fonction_1(&pointeur); // peut modifier pointeur (et I)
    fonction_2( pointeur); // ne peut modifier pointeur mais peut modifier I ;
    Ce n'est pas la seule raison pour laquelle un paramètre du type int ** peut figurer dans la liste des paramètres. Un autre cas courant est le passage à la fonction d'un tableau de pointeur sur int :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void fonction_3(int ** tab);
    ...
    int * Tab[10];
    fonction_3(Tab);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void fonction_4(int (*mat)[N]);
    fonction_4( matrice);
    matrice doit donc être dans ce cas un tableau du type int Tab[...][N] et le paramètre est du type "adresse d'un élément du tableau", comme pour tout tableau. Les éléments du tableau sont ici des tableaux de N int et le type du paramètre doit être "adresse d'un tableau de N int" : int (*) [N] (à différentier de int * [N] : tableau de pointeurs sur int)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void fonction_5(int *((*mat)[N]));
    fonction_5(&matrice);
    ne correspond pas à matrice avec le même type que ci-dessus mais à int * matrice[N] (de même que void fonction_5(int *(*mat)[N]);

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // ne peut modifier pointeur mais peut modifier I ;
    Ceci explique tout.
    Donc si je veux modifier la valeur d'une matrice dans une fonction ceci convient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    modif(matrice);
    ...
    void modif(int (*mat)[N])
    ?

Discussions similaires

  1. allocation et pointeur sur pointeur
    Par noobC dans le forum C
    Réponses: 7
    Dernier message: 13/11/2007, 19h00
  2. pointeur sur pointeur générique
    Par j0o0 dans le forum C
    Réponses: 14
    Dernier message: 10/09/2007, 18h52
  3. les pointeurs sur pointeurs ne m'aiment pas :/
    Par GhostNemo dans le forum C
    Réponses: 3
    Dernier message: 17/12/2006, 23h10
  4. Réponses: 6
    Dernier message: 02/11/2006, 16h44
  5. pointeur sur pointeur
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 01/11/2005, 21h30

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