Pointeur en paramètre en c

Résolu
Bonjour à tous,
voici mon problème. J'ai une fonction dans laquelle j'utilise un pointeur et je voudrais utiliser la valeur de ce pointeur dans une autre fonction mais je ne sais pas comment faire.
Quelqu'un saurait-il comment faire?

Merci d'avance

12 réponses

Résumé de la discussion

Plusieurs développeurs cherchent comment réutiliser la valeur d'un pointeur dans une autre fonction en C, en privilégiant le retour de pointeur ou la transmission du pointeur par paramètre. Des réponses préconisent de retourner un pointeur à partir de la fonction, puis de le redistribuer vers une autre fonction ou directement dans le main pour le réutiliser. Dans l'exemple discuté, la fonction retourne int* et renvoie l'adresse tab[l1][c1], ce qui permet ensuite d'utiliser cette référence dans une autre fonction sans passer par des variables globales. Pour éviter les ambiguïtés, il faut ajuster les prototypes et veiller à ce que le type retourné corresponde au pointeur visé, tout en envisageant la réutilisation via des appels successifs.

Bobot (l’IA à votre service)
  1. pour passer un pointeur que l'on veut pouvoir modifier, il faut passer un pointeur sur le pointeur:
    par ex:
    void pass_ptr(int **ptr){int *b=malloc(sizeof(int));*b=5; *ptr=b;}

    à l'appel, on aura:
    int a=4;
    int *ptr=&a;
    printf("%d",*ptr);--------> 4
    pass_ptr(&ptr); /*passage du pointeur sur le pointeur de a*/
    printf("%d",*ptr);--------> 5
    /* a n'est plus pointé par ptr, c'est b qui l'est */

    si on ne souhaite pas modifier le pointeur, on le passe directement:

    void pass_ptr(int *ptr){*ptr=6; ptr=NULL;/* sans effet en dehors de la fonction */ }

    à l'appel, on aura:
    int a=4;
    int *ptr=&a;
    printf("%d",*ptr);--------> 4
    pass_ptr(ptr); /*passage du pointeur de a*/
    printf("%d",*ptr);--------> 6
    /* a est toujours pointé par ptr */

    cdlt
    0
    1. merci d'avoir répondu ydurce.
      Je n'ai pas vraiment compris ce que tu as écris.
      Le pointeur que je veux renvoyer est utilisé dans une fonction. C'est un pointeur que je veux réutiliser dans une autre fonction directement sans passer par le main(). Je veux réutiliser la valeur sur laquelle pointe le pointeur.

      Est-ce que cela correspond à ce que tu as écris ?
      0
      1. Contributeur
        met ce que tu as écris, on y verra plus clair. En fait, je ne comprends pas où est ton problème et ce que tu cherches à faire au final.
        0
      2. Contributeur
        De ce que je comprend, il a le main qui appelle deux fonctions, et il voudrait faire dialoguer les fonctions sans faire repasser certaiens valeurs par le main ....

        honnetement, en C, a première vue, je ne vois que les déclarations globales.... donc c'est sale.
        En C++, on pourrait passer par un pointeur statique dans une classe, mais pas sur que ce soit élégant....

        en voyant le code, on pourra surement trouver quelque chose d'un peu plus propre
        0
      3. char sniper a raison, envoies nous ce que tu as fait,.
        sinon on parle dans le vide
        0
    2. C'est bien Nabla's.
      La fonction est une fonction qui ne sert que d'exemple pour ce que je veux faire.

        #include<stdio.h>     
        #include<stdlib.h>     
       #include<Windows.h>     
       #define N 8     
       #define M 8     
      
      int initialiser_tab_1(int tab[][M]);     
      int afficher(int tab[][M]);     
      int *selectionner(int tab[][M]);          
      
      int main()     
      {     
             int tab[N][M];     
             int l=0,c=0,p1=0,p2;     
             printf("\n");     
             initialiser_tab_1(tab);     
            afficher(tab);     
            *selectionner(tab);      
            printf("\n\n\n");     
            system("pause");     
            return 0;     
      }     
      
      
      int initialiser_tab_1(int tab[][M])     
      {     
         int l=0,c=0;     
         for(l=0;l<N;l++)     
            {     
              if(l<3)     
               {     
                 for(c=0;c<M;c++)     
                 {     
                   if((l+c)%2==0)     
                       {     
                         tab[l][c]=0;        
                       }     
      
             else     
                  {     
                   tab[l][c]=1;     
                   }     
         }     
         }     
      
         else if(l>=3 && l<=4)     
              {     
                 for(c=0;c<M;c++)     
                {     
                 tab[l][c]=0;     
                 }     
             }     
              
         else     
         {     
            for(c=0;c<M;c++)     
               {     
                 if((c+l)%2==0)     
                      {     
                        tab[l][c]=0;     
                      }     
                else     
                     {     
                      tab[l][c]=2;     
                     }     
            }     
         }     
        }     
        return 0;     
      }     
            
      
      int afficher(int tab[][M])     
      {     
       int l,c;     
            for(l = 0; l<8; l++)     
                {     
                 printf("\n\t\t\t\t");     
                 for(c = 0; c<8; c++)     
                     {     
                       printf("%d", tab[l][c]);     
                       }     
              printf("\n");     
          }     
          return 0;     
      }     
      
      int *selectionner(int tab[][M])     
      {     
       int l1=0,c1=0,*p1;     
       p1=&tab[l1][c1];     
       do     
       {       
          printf("\nEntrez la ligne du pion a deplacer\t");     
          scanf("%d",&l1);     
          printf("Entrez la colonne du pion a deplacer\t");     
          scanf("%d",&c1);     
          printf("\n");     
         }     
        while(l1>10 || c1>10);     
             
        if(tab[l1][c1]==1)     
          {     
            p1=&tab[l1][c1];     
            printf("%d\n",*p1);      
              
        }     
        else     
         {     
            selectionner(tab);     
            printf("pion a deplacer:%d\n",tab[1][c1]);     
         }     
       return &tab[l1][c1];     
      }     
      
      
      
      0
      1. Contributeur
        sans te commander, tu veux bien éditer ton message, utiliser la balise < code > (a droite du souligner), et indenter ton code ? c'est plus agréable à lire ...
        0
    3. Voila
      0
      1. Contributeur
        y a encore un peu de travail sur l'indetation a faire.. mais plus irgent: c'est quoi exactement que tu veux faire passer de où à où ?
        0
      2. je veux réutiliser tab[l1][c1] qui est dans la fonction selectionner dans une autre fonction. J'ai essayé avec un pointeur je n'ai pas réussi et après j'ai essayé avec un pointeur sur pointeur et je n'ai pas réussi.
        je voudrais savoir comment on fait.
        0
    4. Contributeur
      ça manque un peu d'explication tout ça.
      quelle fonction doit appeler l'autre et avec quel pointeur ?
      pourquoi le passage en paramètre ne conviens pas ?
      Un programme n'a pas forcément besoin d'être élégant. Surtout en ce qui concerne les variables globale qui bien utilisés et bien justifié sont très bien. (contrairement aux macros !)
      0
      1. Contributeur
        oulalala lalalala

        attention, j'ai vu une fois une macro qu'elle était bien (pour faire un log de l'execution d'un programme: récupérer le numéro de ligne de code ou on passe)
        0
      2. Contributeur
        pour être plus précis : les macros fonctions, qui traitent des valeurs. Les autres sont très bien.
        0
    5. ben, c'est pas trés clair.

      bon, à première vue , c'est un damier sorte de jeu de dames avec les pions blancs à 1 et les noirs à 2 (ou l'inverse), cases vides à 0.
      jusque là, OK.
      mais par contre , pour selectionner(), je n'ai pas tout compris (d'autant que les l et les 1 sont tout à fait identiques !!!).
      Donc, le **p2=&p1; ne veut rien dire :affecter une adresse de pointeur local à un int (valeur d'une case), je vois mal où tu veux en venir.
      et puis, je ne comprends pas l'utilisation de la récursivité !!
      Et enfin, est-ce p2 que tu espéres voir de toutes tes fonctions ?

      Si possible, donnes nous quelquesexplications
      0
      1. Désolé pour mes explications. Je veux renvoyer tab[l1][c1] utiliser dans selectionner pour le réutiliser dans pointeur.
        Je ne sais pas comment faire.
        0
        1. Contributeur
          ben ... pourquoi pas en utilisant la valeur de retour ? t'as tout déclaré en int, et tu retournes que des 0 .... tu renvoies des int, int * , int ** ou int ********suivant tes besoins... par conter ca passe quand meme par le main ...
          0
        2. déclare selectionner comme çà:
          int *selectionner(.....) et retourne ton pointeur (return &tab[l1][c1] par exemple) vers le main (comme dit nabla's) qui le redistribuera vers une autre fonction si necessaire.
          0
      2. p2 c'était pour un test. j'ai édité mon code, ça devrait être un peu plus clair.
        je veux réutiliser tab[l1][c1] donc j'ai pensé passé par un pointeur *p1.
        0
        1. Contributeur
          pourquoi ne pas appeler pointeur() dans selectionner() ?
          0
      3. en fait j'aurais une fonction qui prendra tab[l1][c1] et une variable tab[l2][c2] et qui devra changer leurs valeurs donc je peux pas appeler pointeur() dans selectionner(). Pointeur est une fonction qui sert pour essayer d'expliquer ce que je veux faire.
        Nabla's je n'ai pas compris ce que tu as dis.
        0
        1. Contributeur
          ui devra changer leurs valeurs donc je peux pas appeler pointeur() dans selectionner()
          Pourquoi ? qu'est-ce qui gène ?
          0
      4. Je n'ai peut-être pas compris l'intérêt de le faire.
        Pourriez-vous m'expliquer svp?

        Si j'ai bien compris je ne peux pas mettre en paramètre tab[l1][c1] ou *p1 en paramètre directement dans les autres fonctions ?
        0
        1. Contributeur
          pourquoi tu ne pourrai pas.
          Il faut faire attention à ce que tu passes en paramètre et aux protections etc. mais tu passes ce que tu veux quand tu veux en paramètre.
          0
      5. J'ai fais ce que vous m'avez dit pour la fonction sélectionner() mais je n'arrive toujours pas à réutiliser tab[l1][c1].
        Pourriez-vous me donner un exemple de fonctions svp ?

        PS: Merci pour votre aide les gars
        0
        1. dans le main, tu fais:
          int * ptr;
          ....
          ....
          ptr=selectionner(tab);
          pointeur(ptr); ou ce que tu veux avec
          0
      6. ça marche!!!!!!!

        Merci ydurce, Nabla's et Char Snipeur pour vôtre aide.
        0