Pointeur en paramètre en c
Résolu
ghosta
Messages postés
25
Date d'inscription
Statut
Membre
Dernière intervention
-
ghosta Messages postés 25 Date d'inscription Statut Membre Dernière intervention -
ghosta Messages postés 25 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Pointeur en paramètre en c
- Paramètre story facebook - Guide
- Remettre parametre usine pc - Guide
- Parametre dns - Guide
- Parametre windows - Guide
- Netflix paramètre compte - Guide
12 réponses
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
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 ?
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 ?
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
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.
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]; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ç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 !)
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
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.
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.
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.
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 ?
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 ?