bizarre equivalence pointeur /tableau !!!

bizarre equivalence pointeur /tableau !!! - C++ - Programmation

Marsh Posté le 27-09-2009 à 16:00:23    

bonjour  
il me semble que les pointeurs et tableaux sont équivalents : mais la je ne comprends pas pourquoi j'obtiens des résultats differents :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. void saisie(short*p,short taille){
  4. int i=0;
  5. for(short*a=p;a<p+taille;++a){
  6.  cout<<"\t saisir la valeur de la "<<i<<" : ";
  7.  cin >>*a;
  8.  cout<<"valeur de a : "<<a<<"\t adresse de a["<<i<<"]: "<<&a[i]<<"\t valeur de a["<<i<<"]: "<<a[i]<<endl;
  9.  cout<<"\t valeur de *a: "<<*a<<endl;
  10.  i++;
  11. }
  12. }
  13. void print(short p[],short taille){
  14. for(short i=0;i<taille;i++)
  15.  cout<<"\t valeur de la case "<<i<<" : "<<p[i]<<endl;
  16. }
  17. int main() {
  18.     cout << "Début du programme" << endl;
  19.  short T1,T2;
  20.  cout<<"Donnez la valeur de T1:";
  21.  cin >>T1;
  22.  cout<<"Donnez la valeur de T2:";
  23.  cin >>T2;
  24.  short a[T1],b[T2];
  25.  cout<<"saisie du tableau a:"<<endl;
  26.  saisie(a,T1);
  27.  cout<<"saisie du tableau b:"<<endl;
  28.  saisie(b,T2);
  29.  cout<<"affichage du tableau a: "<<endl;
  30.  print(a,T1);
  31.  cout<<"affichage du tableau b: "<<endl;
  32.  print(b,T2);
  33. return 0;


 
L'éxcution donne :
 

Code :
  1. Début du programme
  2. Donnez la valeur de T1:2
  3. Donnez la valeur de T2:3
  4. saisie du tableau a:
  5.  saisir la valeur de la 0 : 11
  6. valeur de a : 0x23ff30  adresse de a[0]: 0x23ff30  valeur de a[0]: 11
  7.  valeur de *a: 11
  8.  saisir la valeur de la 1 :
  9. 22
  10. valeur de a : 0x23ff32  adresse de a[1]: 0x23ff34  valeur de a[1]: 148  // pouquoi les adresses sont elles differentes ?
  11.  valeur de *a: 22
  12. saisie du tableau b:
  13.  saisir la valeur de la 0 : 55
  14. valeur de a : 0x23ff10  adresse de a[0]: 0x23ff10  valeur de a[0]: 55
  15.  valeur de *a: 55
  16.  saisir la valeur de la 1 : 66
  17. valeur de a : 0x23ff12  adresse de a[1]: 0x23ff14  valeur de a[1]: -216
  18.  valeur de *a: 66
  19.  saisir la valeur de la 2 : 44
  20. valeur de a : 0x23ff14  adresse de a[2]: 0x23ff18  valeur de a[2]: 0
  21.  valeur de *a: 44
  22. affichage du tableau a:
  23.  valeur de la case 0 : 11
  24.  valeur de la case 1 : 22
  25. affichage du tableau b:
  26.  valeur de la case 0 : 55
  27.  valeur de la case 1 : 66
  28.  valeur de la case 2 : 44


 
merci

Message cité 1 fois
Message édité par terom21 le 27-09-2009 à 16:00:50
Reply

Marsh Posté le 27-09-2009 à 16:00:23   

Reply

Marsh Posté le 27-09-2009 à 16:52:13    

Parce que a[1] == a + 1 * sizeof(short) (a[2] == a + 2 * sizeof(short), etc)

Reply

Marsh Posté le 28-09-2009 à 09:40:12    

un tableau c'ets :
 
Type Var[Size];
 
un pointeur c'ets
Type * Var;
 
La seule equivalence qui existe est que le nom d'un tableau
est aussi un poitneur vers son élément 0.
 
Attention  pas tout mélanger

Reply

Marsh Posté le 28-09-2009 à 13:46:01    

terom21 a écrit :

il me semble que les pointeurs et tableaux sont équivalents

 

Il n'y a d'equivalence entre pointeurs et tableaux en C et en C++ (il y en avait une en B, un ancetre
du C).  Il y a un certain nombre de caracteristiques syntaxiques et semantiques qui entretiennent la
confusion:

 

- lors de la definition des parametres d'une fonction, un parametre de type tableau est ajuste en un
parametre de type pointeur;
- dans beaucoup de contextes (les exceptions en C sont les arguments de sizeof et de &, en C++ il
y en a plus, liees a la resolution des surcharges et a la deduction des arguments template), une valeur
de type tableau est convertie implicitement en un pointeur vers son premier element.  Contrairement
a ce que certains pensent -- et ce qu'une formulation telle que celle de Joel peut laisser croire --
cette conversion n'est en rien liee au fait que le tableau soit une variable et donc nomme.  Elle a lieu
pour n'importe quelle lvalue de type tableau et empeche de fait des rvalues de type tableau d'exister
(sauf en temps de sous-objet de rvalue de type struct).

 

Message cité 1 fois
Message édité par Un Programmeur le 28-09-2009 à 14:39:54
Reply

Marsh Posté le 28-09-2009 à 14:35:01    

Un Programmeur a écrit :


cette conversion n'est en rien liee au fait que le tableau soit une variable et donc nomme.  Elle a lieu
pour n'importe quelle lvalue de type tableau et empeche de fait des rvalues de type tableau d'exister


 
 :jap: merci pour le détail manquant :D

Reply

Marsh Posté le 12-10-2009 à 16:31:50    

-_-' : Tu incrémentes a dans ta boucle. Pas besoin de a[i], ça fait double décalage....


Message édité par Lavock le 12-10-2009 à 16:32:14
Reply

Sujets relatifs:

Leave a Replay

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