[C] Petite question sur les pointeurs deux étoiles qui se suivent

Petite question sur les pointeurs deux étoiles qui se suivent [C] - C++ - Programmation

Marsh Posté le 20-10-2002 à 20:49:43    

Salut,
 
J'ai un peu de mal à comprendre ce bout de programme...
Il sert à échanger deux tableaux, je capte pas les deux étoiles du passage en rouge.
 
Ce qui me tracasse surtout, c'est qu'en mettant une seule étoile, deux, trois ou 36, ça marche aussi bien...
 
Idem si on appelle Echange(p1, p2, DIM); sans mettre l'opérateur &  :??:  
 
Grand merci A+ (désolé si ma question est stupide...)
 
void Echange (int * tabla[ ], int ** tablb, int dim);
void Afficher (int tabl[ ], int dim);
 
 
/* Echange des adresses des 1ers éléments des tableaux */
void Echange (int * tabla[ ], int **tablb, int dim){
int * temp;
temp=*tabla;
*tabla=*tablb;
*tablb=temp;
}
 
void Afficher (int tabl[ ], int dim){
int i;
for (i=0;i<dim;i++) printf("tabl[%d]=%d ", i, tabl[i]);
printf("\n" );
}
 
 
main() {
int tab1[DIM]={1,2,3,4,5};
int tab2[DIM]={5,4,3,2,1};
int * p1 = tab1; int * p2 = tab2;
Afficher(p1, DIM); Afficher(p2, DIM);
Echange(&p1, &p2, DIM);Afficher(p1, DIM); Afficher(p2, DIM);
return 0;
}


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 20-10-2002 à 20:49:43   

Reply

Marsh Posté le 20-10-2002 à 21:45:30    

les pointeurs de pointeurs sont pour des tableaux a 2 dimensions ou si on veut modifier le pointeur d'un tableau


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 21:48:28    

ALors ça serait plutôt le deuxième cas.
 
tu pourrais pas être un peu plus explicite stp ?
clairement ca fait quoi ?
 
ça fait une demi heure que je me prend la tête sur ça...


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 20-10-2002 à 21:56:17    

ce que tu veux c'est juste permuter les premiers éléments de 2 tableaux
 
genre tab1[0]==3 et tab2[0]==5
puis  tab1[0]==5 et tab2[0]==3
 
il y a une certaine equivalence pointeur/tableau.
 
retiens qu'un pointeur est juste une adresse vers le premier élément d'une série d'éléments contigus de meme type
 

Code :
  1. void swap1st(int *t1, int *t2) // <=> int t1[], int t2[]
  2. {
  3.   int tmp=*t1; // <=> t1[0]
  4.   *t1=*t2;
  5.   *t1=tmp;
  6. }
  7. swap(tab1, tab2);


 
les pointeurs s'utilise dans 2 cas: pour les tableaux ou pour modifier un paramètre.
 
si tab est un int[], tab n'est pas modifiable
si tab_pt est un int* , il est modifiable comme n'importe quelle variable
 

Code :
  1. void bond(int **t)
  2. (
  3.   *t++;
  4. }
  5. int tab[10];
  6. int *p=tab; // p==&tab <=> p==&tab[0]
  7. bond(&p); // p==&tab[1]



---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 22:04:15    

oui, ça, OK
 
pour moi *qqch = ce qui se trouve à l'adresse contenue dans la variable qqch
 
donc quand on dit **tablb, on place dans tablb l'adresse de p2 (&p2) c'est bien ça ?
 
idem avec *tabla[], on place dans tabla &p1
 
après la permutation avec tabla, tablb et temp, j'ai  
tabla qui contient &p2
tablb qui contient &p1
...
 
ce qui m'avance pas, puisque moi je veux dire que p1 pointe sur tab2 et p2 pointe sur tab1  :??:  
 
 
et ce qui me tracasse aussi c'est que le programme tourne aussi quand on met une étoile dans le prototype/en-tête, donc je me dis que 2 étoiles c'est superflu...
et on peut aussi en mettre 50 de suite, y'a un warning, mais ça tourne
 
 :??:


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 20-10-2002 à 22:10:37    

c'est pas parce que ca tourne que c'est bon
 

Code :
  1. void pointer_swap(type **p1, type **p2)
  2. {
  3.   type *tmp=*p1;
  4.   *p1=*p2;
  5.   *p2=tmp;
  6. }


 

Code :
  1. pointer_swap(&ptr1, &ptr2);


on passe les paramètres par adresse afin de pouvoir les modifié icic
 
p1 contient l'adresse de ptr1
*p1 contient ptr1
**ptr1 contient le contenu de ptr1
 
faudrait faire un dessin je crois


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 22:29:37    

arf, j'ai tellement réflechi sur mon schéma que ça ressemble à une grosse tâche d'encre :)
 
je crois que j'ai fait +/- tilt, mais j'ai cours demain et je demanderai des renseignements à ce moment là.  Par messages interposés c'est pas l'idéal...
 
merci beaucoup pour ton aide, bonne soirée A+


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 20-10-2002 à 22:39:46    

il faut juste que tu comprennes l'utilité du passage par pointeur et les 2 emplois des pointeurs
 
en clair
 

Code :
  1. void foo(int **tab);
  2. int tablo[XXX];
  3. foo(&tablo);


 
void foo(int **tab);
 
les 2 étoiles/niveau_d'_indirection n'ont pas la meme utilité icic


---------------
du bon usage de rand [C] / [C++]
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed