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
Bonjour,

Bon j'en ai marre. Je ne comprends pas réellement à quoi ca sert.

J'aimerai qu'on me dise réellement à quoi ca sert. Je sais qu'il y a une histoire de mémoire etc, mais concrètement quelle est la différence entre :

int i=0;
int *i;

Lorsque je programme, pour moi, je ne vois pas la différence, quand je programme, l'utilisation de pointeur ne m'est pas utile. J'arrive toujours à m'en sortir sans. Mais je veux comprendre comment les utiliser. Quand par exemple on ne pourrait pas utiliser de int i normal et que le pointeur vient en jeu.

Merci de me répondre, car vraiment je reste perplexe ...

ps: je connais les histoires d'adresse etc

5 réponses

watou Messages postés 199 Date d'inscription   Statut Membre Dernière intervention   28
 
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.
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
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....
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
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
0
valgoku Messages postés 187 Date d'inscription   Statut Membre Dernière intervention   47
 
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 ?
0
Romrom44
 
Ton pointeur fait 4octet mais tu dois quand même alloué de la mémoire via un malloc

Donc ta mémoire est gérée différement

Je sais pas si c'était ça ta question
0
valgoku Messages postés 187 Date d'inscription   Statut Membre Dernière intervention   47 > Romrom44
 
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.
0
Nabla's Messages postés 18203 Date d'inscription   Statut Contributeur Dernière intervention   3 193
 
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 ....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
valgoku Messages postés 187 Date d'inscription   Statut Membre Dernière intervention   47
 
Meme si je sais que par exemple, le i des boucles for ne changera presque jamais . Est ce vrai ? Peut on mettre un pointeur genre for ( *i=0;babla) dans une boucle ?
0