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
Publicité
Posté le 03-03-2001 à 10:24:30
verdoux
And I'm still waiting
Posté le 03-03-2001 à 10:46:06
C'est:
int *pa = &a;
et
int tabint[]={1,2,3}
drakkeng
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?
verdoux
And I'm still waiting
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.
drakkeng
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 !?
verdoux
And I'm still waiting
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.
drakkeng
Posté le 03-03-2001 à 11:27:29
je comprends plus rien
je déteste le C++ c'est incohérent comme langage on peut écrire n'importe quoi.
Pingouin
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.
drakkeng
Posté le 03-03-2001 à 14:59:20
Et quand on déclare un pointeur comme cela
int **variable ;
ça veut dire quoi ?
verdoux
And I'm still waiting
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é )
Publicité
Posté le 03-03-2001 à 15:15:45
drakkeng
Posté le 03-03-2001 à 15:23:43
donc int **variable ça s'initialise comment par exemple ?
BifaceMcLeOD
The HighGlandeur
Posté le 03-03-2001 à 17:37:53
Ben comme ça :
int n = 1;
int* p = &n;
int** variable = &p;
drakkeng
Posté le 03-03-2001 à 17:57:08
je croyais que s'etait un tableau de pointeur a 2 dimenssions ?
Roswell_
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
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).
la viper
Posté le 04-03-2001 à 03:08:31
un tableau à 2 dimensions :
int tab2d[5][5];
3D
int tab3d[5][5][5];
....
Dost67
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 ???).
Dost67
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.
BifaceMcLeOD
The HighGlandeur
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*[]...