Pointeur en paramètre en c
Résoluvoici 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
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.
-
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 -
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 ?-
-
ContributeurDe 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 -
-
-
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]; } -
Voila
-
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 !) -
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 -
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. -
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. -
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. -
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 ? -
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 -
ça marche!!!!!!!
Merci ydurce, Nabla's et Char Snipeur pour vôtre aide.