Pointeur
valgoku Messages postés 187 Date d'inscription Statut Membre Dernière intervention -
Nabla's Messages postés 18203 Date d'inscription Statut Contributeur Dernière intervention - 1 oct. 2009 à 13:43
Nabla's Messages postés 18203 Date d'inscription Statut Contributeur Dernière intervention - 1 oct. 2009 à 13:43
A voir également:
- Pointeur
- Pointeur souris disparu pc portable - Guide
- Pointeur souris - Guide
- Pointeur souris disparu pc portable asus - Guide
- Forum Loisirs / Divertissements
- Forum Windows
5 réponses
les pointeurs sont untilisés dans les allocations dynamique !
int *p;
p = (int *)malloc(sizeof(int));
quand on ne connait pas,à l'avance ,la taille et/ou le nombre des variables qu'a besoin notre programme ! il vaut mieux faire des allocations dynamique.
int *p;
p = (int *)malloc(sizeof(int));
quand on ne connait pas,à l'avance ,la taille et/ou le nombre des variables qu'a besoin notre programme ! il vaut mieux faire des allocations dynamique.
le pointeur est par exemple très utile pour faire des appels de fonction qui modifient les parametres. je te propose un petit test:
test 1: les modifications faites dans changer ne sont pas prise en compte
void changer(int variable)
{
variable ++;
}
void main()
{
int i = 0;
changer(i);
printf("%i",i);
}
test 2: les modifications sont prises en compte
void changer(int *variable)
{
(*variable )++;
}
void main()
{
int *i = (int *)malloc(sizeof(int));
*i = 0;
changer(i);
printf("%i",*i);
}
en fait, dans la pratique, dans le premier exemple, on e une copie du paramètre i sur la pile d'appel. Ce que la fonction modifie, c'est donc la copie (pas très interessant car tu ne peux pas récuperer les modifications faites)
de plus, la taille de la pile est limitée. Dans ce cas, qu'on e un entier (4 octet) ou un pointeur (4 octets) c'est pareil. Par contre, si tu voulais faire er un enorme objet (soyons fous, un objet ou une structure de 1 Mo). Dans le premier exemple, tu copies 1 Mo sur la pile: ca prend du temps, et ca bouffe la pile (le temps de l'execution de la fonction). Dans le 2° exemple, tu copies seulement l'adresse de l'objet: 4 octets ! donc gain de performances....
test 1: les modifications faites dans changer ne sont pas prise en compte
void changer(int variable)
{
variable ++;
}
void main()
{
int i = 0;
changer(i);
printf("%i",i);
}
test 2: les modifications sont prises en compte
void changer(int *variable)
{
(*variable )++;
}
void main()
{
int *i = (int *)malloc(sizeof(int));
*i = 0;
changer(i);
printf("%i",*i);
}
en fait, dans la pratique, dans le premier exemple, on e une copie du paramètre i sur la pile d'appel. Ce que la fonction modifie, c'est donc la copie (pas très interessant car tu ne peux pas récuperer les modifications faites)
de plus, la taille de la pile est limitée. Dans ce cas, qu'on e un entier (4 octet) ou un pointeur (4 octets) c'est pareil. Par contre, si tu voulais faire er un enorme objet (soyons fous, un objet ou une structure de 1 Mo). Dans le premier exemple, tu copies 1 Mo sur la pile: ca prend du temps, et ca bouffe la pile (le temps de l'execution de la fonction). Dans le 2° exemple, tu copies seulement l'adresse de l'objet: 4 octets ! donc gain de performances....
un changement sur l'exemple 1 pour qu'il réagisse comme l'exemple 2:
void changer(int *variable)
{
variable ++;
}
void main()
{
int i = 0;
changer(&i);
printf("%i",i);
}
dis moi si tu as comprit
void changer(int *variable)
{
variable ++;
}
void main()
{
int i = 0;
changer(&i);
printf("%i",i);
}
dis moi si tu as comprit
ok, réponse tres utile ! JE t'en remercie pleinement ! Mais alors une question me vient à l'esprit .
Si le pointeur fait 4 octet comme une variable normale, pourquoi ne pas l'utiliser tout le temps ? Et arreter d'utiliser des variables telle que int i =0 ?
Si le pointeur fait 4 octet comme une variable normale, pourquoi ne pas l'utiliser tout le temps ? Et arreter d'utiliser des variables telle que int i =0 ?
non, pas vraiment, ce que je veux dire, c'est que ok on va allouer de la mémoire, alright ;) mais pourquoi alors, si les pointeurs utilisent de la mémoire dynamique, il ne faut pas mieux utiliser QUE des pointeurs et ne plus se servir de variable avec des tailles fixes ?
Mais je dois aussi que j'ai programmer en C++ et que dans les private des objets, les variables ne changent pas .. enfin si je ne me trompe pas, mais ca on oublie ! Revenons en au pb.
Mais je dois aussi que j'ai programmer en C++ et que dans les private des objets, les variables ne changent pas .. enfin si je ne me trompe pas, mais ca on oublie ! Revenons en au pb.
quand tu utilises une variable normale, tu utilises la taille de la variable (bool, char=>1 octet; short 2 octets; int 4 octets; double 8 octet, etc...).
quand tu utilises un pointeur, tu as ton pointeur qui est lui meme considéré comme une variable traditionnelle(c'est un unsigned int), et qui pointe sur la zonne mémoire que tu lui as aloué pour stoquer ce qu'il doit stocker.
pour faire simple:
- traditionnel = taille du type (sur la pile)
- pointeur = pointeur (4 octets) sur la pile + taille du type (sur le tas mémoire). donc au final plus gros
de plus, la pile est assez simple à gérer: on empile, on dépile..... pas de résidus ! alors que la mémoire du tas se fragmente, et il faut donc avoir un bon geestionaire de mémoire pour gérer ca...
exemple de fragmentation mémoire:
j'ai 32 octets de mémoire pour mon application (ca fait petit ;)
je réserve 10 pour A (de 0 à 9), puis 7 pour B (de 10 à 16), puis 10 pour C(de 17 à 26)
il me reste l'espace libre de 27 à 31 : 5 octets...
maintenant je n'ai plus besoin de B (je libère de 10 à 16, donc 7octets). Il me reste 12 octets en mémoire ( de 10 à 16 et 27 à 31).
j'ai besoin de 10 pour une variable D (10 qui se suivent bien sur). Sachant qu'il me reste 12, ou es ce que je peux placer D ? réponse nul par, il n'y a pas la place pour avoir 12 d'affilé. C'est la fragmentation mémoire, et c'est parce que j'ai peut être utilisé trop de pointeurs là ou il n'y en avait pas besoin ....
quand tu utilises un pointeur, tu as ton pointeur qui est lui meme considéré comme une variable traditionnelle(c'est un unsigned int), et qui pointe sur la zonne mémoire que tu lui as aloué pour stoquer ce qu'il doit stocker.
pour faire simple:
- traditionnel = taille du type (sur la pile)
- pointeur = pointeur (4 octets) sur la pile + taille du type (sur le tas mémoire). donc au final plus gros
de plus, la pile est assez simple à gérer: on empile, on dépile..... pas de résidus ! alors que la mémoire du tas se fragmente, et il faut donc avoir un bon geestionaire de mémoire pour gérer ca...
exemple de fragmentation mémoire:
j'ai 32 octets de mémoire pour mon application (ca fait petit ;)
je réserve 10 pour A (de 0 à 9), puis 7 pour B (de 10 à 16), puis 10 pour C(de 17 à 26)
il me reste l'espace libre de 27 à 31 : 5 octets...
maintenant je n'ai plus besoin de B (je libère de 10 à 16, donc 7octets). Il me reste 12 octets en mémoire ( de 10 à 16 et 27 à 31).
j'ai besoin de 10 pour une variable D (10 qui se suivent bien sur). Sachant qu'il me reste 12, ou es ce que je peux placer D ? réponse nul par, il n'y a pas la place pour avoir 12 d'affilé. C'est la fragmentation mémoire, et c'est parce que j'ai peut être utilisé trop de pointeurs là ou il n'y en avait pas besoin ....
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question