[c++] besoin d'une petite explication

besoin d'une petite explication [c++] - Programmation

Marsh Posté le 03-03-2001 à 10:24:30    

Bon je débute en c++ et il y a une notion que je comprends pas trop avec les pointeurs:
voici un petit exemple :
 
quand on fait
 
int a=2;
int pa=&a;
 
pour accéder a la valeur de la variable pointée par "pa" on fait un truc du genre:
 
int b=*pa;//b vaut 2
 
mais la ou je comprends plus c'est avec les tableaux de pointeurs
exemple:
 
int *tabint[]={1,2,3};
 
comment se fait-il que pour accéder au valeur 1,2 ou 3 il suffise d'écrire:  
 
int b=tabint[0]; //b prend comme valeur 1  
...
 
je pensais que:  
int b=*tabint[0];  était la syntaxe logique pour accéder a la valeur .
 
merci de vos explications

Reply

Marsh Posté le 03-03-2001 à 10:24:30   

Reply

Marsh Posté le 03-03-2001 à 10:46:06    

C'est:
int *pa = &a;
et
int tabint[]={1,2,3}

Reply

Marsh Posté le 03-03-2001 à 10:54:38    

oui mais j'ai souvent vu des choses du genre :
 
int *tabint[]={1,2,3} dans des livres  
 
ça corresponds a quoi?
tabint[0] pointe sur 1 ?
tabint[1] pointe sur 2 ?
tabint[2] pointe sur 3?

Reply

Marsh Posté le 03-03-2001 à 11:00:03    

La je comprends pas trop, ça veut dire que tabint est un tableau de pointeurs sur des int.

Reply

Marsh Posté le 03-03-2001 à 11:03:40    

oui c'est ça ,mais la ou je comprends plus c'est la façon dont on accéde aux int pointé :
 
en faisant par exemple :
 
cout << tabint[0] //on obtient 1 a l'écran  
 
je trouve cela bizzare !?

Reply

Marsh Posté le 03-03-2001 à 11:10:11    

Avec int* tab[]={1,2,3}, tab[0] est l'adresse pointée et cette adresse vaut ici 1.
Si tu veux accéder à l'int pointé, il faut faire *tab[0] et en principe l'appli plante.
 
SI tu as vu int* tab[]={1,2,3} dans un bouquin, jette le.

Reply

Marsh Posté le 03-03-2001 à 11:27:29    

je comprends plus rien :cry:
 
je déteste le C++ c'est incohérent comme langage on peut écrire n'importe quoi.

Reply

Marsh Posté le 03-03-2001 à 13:23:47    

Ben ça c'est du C pas du C++
int *t[] = {1, 2, 3}
Ca veut dire que les pointeurs ont comme adresse 1, 2 et 3. Ce qu'ils pointent ne l'est certainement pas.
 
Guillaume.

Reply

Marsh Posté le 03-03-2001 à 14:59:20    

Et quand on déclare un pointeur comme cela  
 
int **variable ;
 
ça veut dire quoi ?

Reply

Marsh Posté le 03-03-2001 à 15:15:45    

variable est déclaré comme un pointeur sur un pointeur sur un int.
 
int *(*(*variable[N])())() déclare variable comme un tableau de N pointeurs sur des fonctions retournant des pointeurs sur des fonctions retournant des pointeurs sur des int (si je me suis pas trompé :D)

Reply

Marsh Posté le 03-03-2001 à 15:15:45   

Reply

Marsh Posté le 03-03-2001 à 15:23:43    

:crazy:
donc int **variable ça s'initialise comment par exemple ?

Reply

Marsh Posté le 03-03-2001 à 17:37:53    

Ben comme ça :
 
int   n = 1;
int*  p = &n;
int** variable = &p;
 
:D

Reply

Marsh Posté le 03-03-2001 à 17:57:08    

je croyais que s'etait un tableau de pointeur a 2 dimenssions ?

Reply

Marsh Posté le 03-03-2001 à 21:58:31    

oui ben c'est ça, on peu l'initialiser comme ca
int i=0;
int **tab=(int **)malloc(h*sizeof(int *));// on alloue h pointeur sur pointeurs de type int
for(i=0;i<h;i++)
  tab[i]=(int *)malloc(w*sizeof(int));// on alloue w pointeur sur int
 
apres tu peux manipuler le tableau d'int comme ça tab[i][j]//i<h et j<w


---------------
http://www.cheata.net le site qui vous donne la banane!
Reply

Marsh Posté le 04-03-2001 à 03:07:26    

int a; -> entier
int *p; -> pointeur d'entier ex: p = &a;
int **pp; -> pointeur sur pointeur d'entier ex: pp = &p;
 
maintenant, il faut voir qu'un tableau n'est en fait qu'un pointeur !!!!
 
int tab[5]; equivaut à int *tab;
sauf qu'on dit qu'on reserve 5 zones memoire de 2 octets (int) a partir de l'adresse de tab.
 
tab[0] -> equivaut à tab (l'adresse du pointeur ou la valeur pointée)
 
tab[1] -> *(tab+1)
tab[2] -> *(tab+2)
 
c'est juste une question de visibilité.
 
maintenant, les pointeurs de pointeurs c'est la meme choses sauf qu'au lieu que ce soit des entiers dans le tableau, se sont des pointeurs (adresses).

Reply

Marsh Posté le 04-03-2001 à 03:08:31    

un tableau à 2 dimensions :
 
int tab2d[5][5];
 
3D
 
int tab3d[5][5][5];
 
....

Reply

Marsh Posté le 04-03-2001 à 11:21:13    

Les pointeurs sur des tableaux sont utiles quand il s'agit de chaînes de caractères constantes.
 
Exemple tiré d'un bouquin Delannoy :
int * jour[7] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"} ;
 
Là jour[1] c'est l'adresse du début de la chaîne "mardi". On y accède donc par * jour[1] ou alors avec le %s pour l'adresse d'une chaîne de caractère (me trompeux-je ???).

Reply

Marsh Posté le 04-03-2001 à 11:26:43    

J'oubliais de préciser qu'en C, une chaîne de caractère constante retourne son adresse donc dans jour[0] il y a l'adresse de Lundi.
 
Ce qui confirme que dans int * t[] = {1, 2, 3} ;
t[0] aura comme adresse 1, ce qui ne représente rien.

Reply

Marsh Posté le 04-03-2001 à 18:06:03    

Dost67 a écrit a écrit :

Les pointeurs sur des tableaux sont utiles quand il s'agit de chaînes de caractères constantes.
 
Exemple tiré d'un bouquin Delannoy :
int * jour[7] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"} ;
 
Là jour[1] c'est l'adresse du début de la chaîne "mardi". On y accède donc par * jour[1] ou alors avec le %s pour l'adresse d'une chaîne de caractère (me trompeux-je ???).




Ben la seule erreur que je vois comme ça est que jour doit être déclaré de type char*[] et non int*[]...

Reply

Sujets relatifs:

Leave a Replay

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