Salut,
Je suppose que tu débutes en C/C++ et donc tu cherches à apprendre les bases du maniement, à savoir les tableaux et les pointeurs. C'est très bien.
Mais n'oublie pas, pour la suite, que tu ne devrais jamais manipuler directement tes tableaux ainsi.
En C++, il est fortement recommandé de "accorder une responsabilité cohésive à chaque entité" (pour citer un article bien connu ici).
Autrement dit, plutôt que de manipuler directement ton tableau, tu préfères faire un objet qui contiendra ton tableau et qui permettra d'y accéder sans risque de :
- lire ou écrire or du tableau
- ne pas initialiser ton tablea
- ne pas libérer les ressources
...
Ce petit sermon étant fait, je peux te donner la réponse à ta question.
Quand tu as écrit :
1 2
| int** t;
t = new int*[10]; |
tu as alloué un tableau de 10 pointeurs d'entiers et tu as stocké l'adresse de ce tableau dans ton pointeur t;
Pour obtenir le 4ème élément de ce tableau, tu dois donc écrire :
bien sur ce quatrième élément est un pointeur d'entier, puisque le tableau est un tableau de pointeurs d'entiers.
donc on peut écrire :
int* pt4 = t[4]; // ici je crée un pointeur d'entier pt4 et je le fait pointer au même endroit que le quatrième pointeur d'entier du tableau
pour obtenir l'entier pointé par un pointeur, tu le fais précéder de *, tu peux donc écrire :
1 2
| int* pt4 = t[4]; // ligne déjà évoquée ci-dessus
int i = *pt4; // récupération de l'entier pointé par le pointeur |
ou en abrégé :
ATTENTION :
si tu écris seulement :
1 2 3
| int** t;
t = new int*[10];
int i = *(t[4]); |
alors tu fais une erreur, car tu n'as pas alloué d'espace mémoire pour ton 4ème entier.
Je m'explique :
Quand tu écris :
tu alloue de l'espace pour ton tableau de pointeur d'entiers. Donc tu as en mémoire un tableau de pointeurs, mais ces pointeurs pointent sur rien du tout. Si tu veux pouvoir les utiliser, tu dois les faire pointer sur un espace mémoire existant :
- soit en réservant cet espace :
1 2 3 4
| int** t;
t = new int*[10];
t[4] = new int; // ici je réserve un espace pour mon entier
int i = *(t[4]); |
- soit en les faisant pointer sur un espace déjà existant.:
1 2 3 4 5
| int** t;
t = new int*[10];
int j = 7; // ici je crée un entier j
t[4] = &j; // ici je fais pointer mon pointeur sur j
int i = *(t[4]); |
La gestion de la mémoire, c'est un peu compliqué quand tu commençe, mais tu verras ça en présente en réalité pas vraiment de difficulté quand tu es bien rodé.
Aussi, accroche toi et bonne chance pour ton apprentissage.
Partager