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 :

Usage des pointeurs dans les fonctions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Par défaut Usage des pointeurs dans les fonctions
    Bonjour,

    je cherche une explication à un problème de bon usage des pointeurs lors d'un appel de fonction C.

    Voici mon code :

    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
     
    #include <stdio.h>
     
    int entier;
     
    int foo ( int *ptr ) {
      ptr = &entier;
    }
     
    int main ( void ) {
      int *a;
      entier = 200;
      foo(a);
      printf("%d\n",*a);
    }
    Dans le programme principal, je pensais qu'après l'appel de foo(), mon pointeur "a" prendrait l'adresse de la variable globale "entier". Il semblerait que non... Est ce que quelqu'un pourrait m'expliquer pourquoi ? Est ce que parce que passé ainsi, ce pointeur est en fait passé par valeur, ce qui empêche toute modification ?

    Merci d'avance

    Didou

  2. #2
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 3
    Par défaut
    Effectivement, après quelques ajouts permettant de visualiser les différentes adresses, voici la trace (et le code associé) :

    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
     
    #include <stdio.h>
     
    int entier;
     
    int foo ( int *ptr ) {
     
      ptr = &entier;
      printf("Adresse pointée par ptr : %x\n",ptr);
    }
     
    int main ( void ) {
     
      int *a;
      printf("Adresse de la variable entier %x\n",&entier);
      entier = 200;
      foo(a);
      printf("Adresse pointée par a : %x\n",a);
      printf("entier = %d, *a = %d\n",entier,*a);
    }
    La trace :
    Adresse de la variable entier 80496b0
    Adresse pointée par ptr : 80496b0
    Adresse pointée par a : b7815ff4
    entier = 200, *a = 1318268

    Une explication ?

  3. #3
    Membre actif
    Avatar de fmdao
    Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 90
    Par défaut
    Il faut une double indirection.
    Il faut passer comme parametre un pointeur sur le pointeur.

    foo( int **ptr)

  4. #4
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Arrivé par hasard sur le sujet je me permet de l'enrichir d'une question supplémentaire (surtout pour voir si j'ai compris).

    Le code suivant serait-il équivalent à ce que propose fmdao ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int entier;
     
    int foo ( int *ptr ) {
      ptr = &entier;
    }
     
    int main ( void ) {
      int a;
      entier = 200;
      foo(&a);
      printf("%d\n",a);
    }

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonsoir.
    C'est la fonction foo qui pose problème, donc... oui...
    Du moins sur le fait qu'après l'appel de la fonction, la valeur pointée par/de a n'est pas celle d'entier.

    La seule différence, c'est que dans le code de fmdao, a ne pointe sur aucune zone particulière (pointe n'importe où, en gros), et donc *a n'est pas forcément valide.

  6. #6
    Membre actif
    Avatar de fmdao
    Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 90
    Par défaut
    Ok mais, ce n'était pas la logique du premier programme.

    int main ( void ) {
    int *a;
    entier = 200;
    foo(a);
    printf("%d\n",*a);
    }


    Voulait-il récupérer la valeur de a ou un pointeur sur un entier qui existe belle et bien puisque en globale ?

    Je suis d'accord que dans l'absolu, c'est maladroit

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/06/2010, 16h24
  2. Réponses: 15
    Dernier message: 23/01/2010, 18h39
  3. [plpgsql] transaction dans les fonctions ?
    Par hpghost dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/06/2004, 16h56
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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