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, void ?


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Pointeur, void ?
    Bonsoir

    J'ai fait quelques tests avec une fonction et je ne comprends pas du tout la logique qu'il y a derrière, le résultat à l'aire même d'être paradoxale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int* fct(int n,char c[], int* p){
      //je fais pointer p la où il le faut
     
    }
     
    void fct(int n,char c[], int* p){
      //je fais pointer p la où il le faut
     
    }
    Execution donne bien ce quil faut mais uniquement si le main est écrit comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(){
     
       int* p = fct(1, "test teste", p);
    }
    ou sinon ça plante

    Normalement on initialise le pointeur sur NULL
    et ensuite on le fait pointer,non?

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    double déclaration de fct, je suis surpris que ton compilo te jete pas au début quoique il considère que le void est un int peut être ^^
    Les pointeurs sont fait pour être passé dans le tube donc je vois pas l'interet d'utiliser un pointeur si c'est pour faire un return derrière.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Une fois avec le void et l'autre fois avec int*, ce sont deux variantes.

    Normalement dans le main pour recupérer le pointeur

    on initialise
    puis on lui affecte ladresse via fct

    Suivre ces regles fait crasher le programme alors que faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int *p = fct(1,"blabla",p);
    fonctionne parfaitement.

    Y a un bug dans la matrice?

    Ou dans ma cervelle?


    Edit: désolé Melem je sais pas mettre le code en format code.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Hello,

    Confusion "classique"
    Passer un pointeur en parmètre ne veut pas dire que modifier le pointeur à l'intérieur de la fonction modifie le pointeur correspondant à l'extérieur.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void fct(int a) {
        a = 5;
    }
     
    int main(void) {
        int x = 1;
        fct(x);
        // que vaut x ici ?
    }
    La réponse à la question est 1 : l'appel à la fonction n'a pas changé la valeur de x.
    Que ce soit un int, ou un int*, c'est pareil !

    Si tu veux changer la valeur de p à l'extérieur, il faut que ta fonction propose non pas un pointeur int*, mais un pointeur int**. Ensuite, dans ta fonction, tu ne modifieras plus p, mais *p

    [EDIT] Ou alors, comme tu l'as trouvé toi même, tu peux aussi retourner l'adresse comme valeur de retour.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Et pour tenter d'être un peu plus clair, en C, les paramètres dans une fonction, sont toujours des copies des données initiales.

    Dans ton cas, le pointeur est donc recopié (mais pas la zone pointée !), et dans ta fonction tu modifies donc une copie du pointeur, qui n'existe plus une fois que ta fonction se termine.

    En C++ il y a une solution qui est le passage par référence, en C on se débrouille avec des pointeurs : pour un int, on met un int*; pour un int*, on met un int** (ce qui est ton cas)

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    J'ai du mal à comprendre ta question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int* p = NULL;
    fct(1,"balabla",p);
    Est-ce que tu veux que le pointeur p soit modifié par la fonction fct ?
    Si c'est le cas, c'est normal que ça ne marche pas. Tu passes à la fonction seulement sa valeur. Cela veut dire que seul le contenu de la mémoire pointé par ce pointeur pourra être modifié et non pas la valeur elle-même du pointeur. Dans la fonction fct, tu crées une variable locale (un pointeur), nommé p aussi, qui est immédiatement détruit une fois que la fonction prend fin. Le pointeur p de la fonction appelante ne peut donc pas être modifié ainsi.

    Si tu veux modifier la valeur d'un pointeur par la fonction appelée, il faut lui envoyer son adresse (i.e. l'adresse à laquelle sa valeur est stockée), puis la fonction appelée doit prendre en argument un pointeur de pointeur.
    En déréférençant (avec une étoile) le pointeur, on accède ainsi à la valeur du pointeur de la fonction appelante.

    Tu as un résultat de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void fct(int n,char c[], int** p) /* **p -> pointeur de pointeur */
    {
      /*
      'p' a pour valeur l'adresse où est stocké le pointeur 'p' de 'fonction()'
      '*p' a pour valeur la valeur du pointeur 'p' de 'fonction()'
      '**p' correspond à l'entier stocké à l'adresse pointée par le pointeur 'p' de 'fonction()'
      */
    }
    void fonction ( void )
    {
      int* p = NULL;
      fct(1,"balabla", &p); /* passage de l'ADRESSE du pointeur */
    }
    EDIT : mince... multigrillé...

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Merci à vous, tout est clair a présent.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/02/2009, 16h08
  2. Pointeur void *
    Par coberle dans le forum C++
    Réponses: 7
    Dernier message: 12/12/2008, 20h11
  3. Paramètres de PostMessage et pointeur void ?
    Par tintin72 dans le forum Windows
    Réponses: 8
    Dernier message: 17/06/2008, 13h36
  4. tableau de pointeurs void
    Par CerbeRGD dans le forum Débuter
    Réponses: 10
    Dernier message: 15/02/2008, 18h38
  5. Pointeur void *
    Par Atharendil dans le forum C
    Réponses: 6
    Dernier message: 04/05/2006, 09h53

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