Existe-t-il un moyen d'empêcher l'itération de la boucle while ci-dessous après avoir dépassé 40? J'essaie de reproduire le concept d'itération de liste liée alors que le pointeur NULL
n'est pas trouvé.
int main() { int* arr = new int[4]{ 10,20,30,40 }; //for(int i=0; i<4; ++i) -- works fine while (arr) { cout << *(arr++) << endl; } delete[] arr; // Free allocated memory return 0; }
4 Réponses :
Y a-t-il des moyens d'empêcher la boucle while ci-dessous de s'itérer après avoir dépassé 40?
Il y a deux façons d'arrêter la boucle: faire en sorte que la condition devienne fausse, ou sauter hors de la boucle (break, goto, return, throw, etc.). Votre boucle ne fait pas non plus.
Votre condition est arr
qui n'est fausse que si le pointeur pointe vers null. Vous n'attribuez jamais nul à arr
, il n'est donc jamais nul.
J'essaye de reproduire le concept de liste chaînée
Les concepts de listes liées ne s'appliquent généralement pas aux éléments qui ne sont pas des listes liées. Les tableaux ne sont pas des listes liées.
Puisque arr
est placé dans une mémoire contiguë, vous n'obtiendrez jamais une valeur NULL de l'adresse mémoire APRÈS arr
.
Vous pouvez essayer code suivant sur le compilateur en ligne.
10 0x182de74 20 0x182de78 30 0x182de7c 40 0x182de80 NULL is 0
La sortie pourrait être quelque chose comme ça :
#include <iostream> int main() { int* arr = new int[4]{ 10,20,30,40 }; for(int i=0; i<4; ++i){ std::cout << *(arr++) << std::endl; std::cout << arr << std::endl; } std::cout << "NULL is " << (int*)NULL; // NULL mostly stands for 0. return 0; }
Pourquoi la liste liée fonctionne-t-elle? Parce que la liste liée stocke les données dans une mémoire non contiguë et que next ()
vous donnerait NULL
comme signe de la fin d'une liste.
Vous aussi pourrait avoir besoin d'un livre fondamental de C ++.
Voici la booklist .
Utilisez une valeur réservée telle que zéro et ajoutez-la à la fin du tableau, comme avec une ancienne chaîne C. C'est ce qu'on appelle un élément sentinelle.
int* arr = new int[4]{ 10,20,30,40,0 }; while (*arr) { ...
int [4] est un tableau C. À la place, utilisez C ++ std :: array et son itérateur:
#include <array> #include <iostream> int main() // Print until the 1st 0 item { std::array<int, 6> arr{ 10, 20, 30, 40, 0, 0 }; for (auto i : arr) { if (i == 0) break; std::cout << i << std::endl; } }
Ou:
#include <array> #include <iostream> int main() // Print all items { std::array<int, 4> arr{ 10, 20, 30, 40 }; for (auto i : arr) std::cout << i << std::endl; }
Les pointeurs ne deviennent NULL lorsqu'ils atteignent la fin du tableau. C ++ ne fonctionne pas de cette façon.
Réponse courte: Non.
(arr + 4) n'est PAS NULL. Vous pouvez essayer de
std :: cout << (arr ++)
et vérifier ce que vous obtenez.Le concept de liste chaînée s'applique aux listes chaînées. Le tableau dynamique est une mauvaise odeur dans le C ++ moderne. Vous voulez un
std :: vector
.int count = 4; while (count--) {...}