Ton cours il était en C ou C++ ? Car ça change tout ^^ (enfin pour cette explication)
2) Et surtout, pourquoi si le nombre de données à traiter est inconnu au moment de l'écriture du programme, alors pourquoi la première technique utilisant le nom des variables (et pas un pointeur) est inapplicable ?
Je ne sais pas si j'ai très bien compris la formulation de la question mais je vais essayer de partir d'un exemple.
Imagine tu as un parc de voitures identifiées par un int (exemple vraiment pourri mais je ne sais pas pourquoi c'est le premier truc qui m'est venu à l'esprit).
Tu peux déclarer
int voiture1, voiture2, ... voiture1000
C'est long. Pour simplifier tu peux déjà déclarer un tableau de voiture :
1 2 3 4 5
| int voitures[1000];
//puis
voitures[0] = ...;
...
voitures[999] = ...; |
Maintenant imagine tu veux ajouter une voiture à ton parc.
Dans ce cas, et dans la situation présente, tu ne peux pas ! En effet tu n'as pas le droit d'accéder à la case 1000 ou plus du tableau voitures sinon tu vas avoir droit à un segment fault. Comment faire alors ?
Eh bien les pointeurs permettent de résoudre la solution :
1 2
|
int *voitures = (int*)malloc(1000*sizeof(int)); |
La tu déclares un "parc" de 1000 valeurs de type int.
Ainsi lorsque tu voudras ajouter une voiture tu pourras réallouer l'espace mémoire pour qu'il puisse accueillir une voiture de plus avec realloc :
1 2 3
|
voitures = (int*)realloc(1001*sizeof(int));
voitures[1000] = ...; |
Bon évidemment ce que je fais là est nul est sale, donc c'est pas vraiment un bon exemple, surtout qu'il ne faut pas oublier de libérer la mémoire avec free sinon t'auras des pertes de mémoire !
Je viens d'avoir un exemple un peu meilleur, toujours avec un parc de voitures . Imagine tu veux que l'utilisateur entre le nombre de voitures de ton parc (avec scanf par exemple bien que ce soit mal d'utiliser scanf).
Tu fais comment maintenant que l'utilisateur a rentré le nombre de voitures pour les créer, ces voitures ?
Là tu es obligé de passer par l'allocation dynamique, les pointeurs :
1 2
| scanf("%d",nombreDeVoitures);
voitures = (int*)malloc(nombreDeVoitures*sizeof(int)); |
Et là tu as bien un parc constitué du nombre de voitures entré par l'utilisateur, si tu y réfléchis bien tu n'aurais pas pu faire autrement pour avoir pile le bon nombre.
Enfin il ne faut pas oublier de libérer la mémoire allouée, avec free :
Voilà j'espère t'avoir un peu éclairé
EDIT : Zut on est dans le forum C++ autant pour moi j'ai écris des choses absurdes avec malloc et free alors qu'il faut le faire avec new et delete mais je modifierai cela demain.
Partager