Je suis confus sur la façon de créer un tableau défini dynamique:
int *array = new int[n];
Je n'ai aucune idée de ce que cela fait. Je peux dire que cela crée un pointeur nommé tableau qui pointe vers un nouvel objet/tableau int? Quelqu'un voudrait-il expliquer?
new alloue une quantité de mémoire nécessaire pour stocker l'objet/le tableau demandé. Dans ce cas, n nombres d'int.
Le pointeur stockera ensuite l'adresse dans ce bloc de mémoire.
Mais attention, ce bloc de mémoire alloué ne sera pas libéré tant que vous ne le lui aurez pas dit en écrivant
delete [] array;
int *array = new int[n];
Il déclare un pointeur sur un tableau dynamique de type int
et de taille n
.
Une réponse un peu plus détaillée: new
alloue une mémoire de taille égale à sizeof(int) * n
octets et renvoie la mémoire stockée par la variable array
. De plus, puisque la mémoire est allouée dynamiquement à l'aide de new
, vous devez la désallouer manuellement en écrivant (lorsque vous n'en avez plus besoin, bien sûr):
delete []array;
Sinon, votre programme perdra de la mémoire d'au moins sizeof(int) * n
octets (éventuellement davantage, en fonction de la stratégie d'allocation utilisée par la mise en œuvre).
La déclaration a essentiellement les effets suivants:
Il alloue sur le tas un espace égal à un tableau entier de taille N, .__ et lui renvoie un pointeur, qui est affecté au pointeur de type int * appelé "tableau".
Il alloue autant d’espace en fonction de la valeur de n et le pointeur pointe vers le tableau, c’est-à-dire le 1er élément du tableau
int *array = new int[n];
En C/C++, les pointeurs et les tableaux sont (presque) équivalents .int *a; a[0];
retournera *a
et a[1];
renverra *(a + 1)
Mais array ne peut pas changer le pointeur vers lequel il pointe, alors que le pointeur le peut.
new int[n]
allouera des espaces pour le "tableau"
A partir de C++ 11, le moyen sûr de le faire pour la mémoire (toujours avec une construction similaire) est d'utiliser std::unique_ptr
:
std::unique_ptr<int[]> array(new int[n]);
Cela crée un pointeur intelligent sur un bloc de mémoire suffisamment grand pour les entiers n
qui se supprime automatiquement quand il sort de la portée. Ce nettoyage automatique est important car il évite le cas où votre code se ferme tôt et n'atteint jamais votre instruction delete [] array;
.
Une autre option (probablement préférable) consisterait à utiliser std::vector
si vous avez besoin d’un tableau capable de redimensionnement dynamique. C'est bien quand vous avez besoin d'une quantité inconnue d'espace, mais cela a quelques inconvénients (temps non constant pour ajouter/supprimer un élément). Vous pouvez créer un tableau et y ajouter des éléments avec quelque chose comme:
std::vector<int> array;
array.Push_back(1); // adds 1 to end of array
array.Push_back(2); // adds 2 to end of array
// array now contains elements [1, 2]