Je ne comprend pas les pointeurs
Fermé
sandra
-
10 juin 2008 à 00:06
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 10 juin 2008 à 11:09
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 10 juin 2008 à 11:09
A voir également:
- Je ne comprend pas les pointeurs
- Je ne vois plus le pointeur de ma souris - Guide
- Pointeurs souris - Guide
- Le pointeur de la souris ne bouge plus - Forum souris / Touchpad
- Manipulation des pointeurs - Forum C
- Pointeurs photoshop problème ✓ - Forum Photoshop
8 réponses
KX
Messages postés
16746
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
29 juin 2024
3 016
10 juin 2008 à 00:13
10 juin 2008 à 00:13
Dans ce cas précis tu ne devrais pas avoir besoin de ^mma...
KX
Messages postés
16746
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
29 juin 2024
3 016
10 juin 2008 à 00:19
10 juin 2008 à 00:19
La différence est purement technique...
il y a le nom : mma (qui identifie ta variable) et le pointeur ^mma (qui localise la position mémoire de ta variable)
tu peux modifier le contenu de ta variable sans changer le pointeur à condition d'utiliser la même taille mémoire.
Si tu veux augmenter dynamiquement la taille mémoire d'un objet (impossible sur un array) il te faudra réafecter le pointeur
il y a le nom : mma (qui identifie ta variable) et le pointeur ^mma (qui localise la position mémoire de ta variable)
tu peux modifier le contenu de ta variable sans changer le pointeur à condition d'utiliser la même taille mémoire.
Si tu veux augmenter dynamiquement la taille mémoire d'un objet (impossible sur un array) il te faudra réafecter le pointeur
KX
Messages postés
16746
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
29 juin 2024
3 016
10 juin 2008 à 00:20
10 juin 2008 à 00:20
Remarques (de mémoire) :
Il doit y avoir égalité entre p et ^mma (tous deux pointeurs), de même qu'entre p^ et mma (tous deux array)
Il doit y avoir égalité entre p et ^mma (tous deux pointeurs), de même qu'entre p^ et mma (tous deux array)
y a pas un bons cours sur les pointeurs (je ne veux pas le cours de développer)
merci
merci
KX
Messages postés
16746
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
29 juin 2024
3 016
10 juin 2008 à 00:31
10 juin 2008 à 00:31
Apparemment tu utilises un langage Pascal (comme moi) mais je n'ai véritablement compris les pointeurs qu'avec le tutoriel de C du site du Zéro il ne te sera pas nécessaire de comprendre le C pour comprendre les explications théoriques sur les pointeurs... alors bonne chance !
--
La confiance n'exclut pas le contrôle
--
La confiance n'exclut pas le contrôle
marwina32
Messages postés
218
Date d'inscription
samedi 7 juin 2008
Statut
Membre
Dernière intervention
7 avril 2010
32
>
KX
Messages postés
16746
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
29 juin 2024
10 juin 2008 à 00:45
10 juin 2008 à 00:45
bonsoir;
oui, c'est un très bon site, moi aussi je n'ai ps compris les pointeurs qu'avec m@téo du site du zéro
oui, c'est un très bon site, moi aussi je n'ai ps compris les pointeurs qu'avec m@téo du site du zéro
KX
Messages postés
16746
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
29 juin 2024
3 016
10 juin 2008 à 00:54
10 juin 2008 à 00:54
Récemment j'ai lu une question qui concernait un algorithme utilisant des pointeurs : ici
La réponse que j'y est faite est très imagée, mais elle te permettrai peut-être de voir une explication détaillé (sur un exemple) d'un programme nécessitant l'utilisation de pointeurs.
La réponse que j'y est faite est très imagée, mais elle te permettrai peut-être de voir une explication détaillé (sur un exemple) d'un programme nécessitant l'utilisation de pointeurs.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
328
10 juin 2008 à 01:11
10 juin 2008 à 01:11
Bonsoir,
Comme le dit KX, le pointeur est en fait l'adresse de ton objet en mémoire.
C'est à la fois très pratique et très contraignant :
- tu ne manipules plus qu'une adresse, donc un objet très léger (en général la taille d'un entier). Cela est super pratique dans le cas où tu as des structures de données assez lourdes, et que tu en as beaucoup : la mémoire utilisée peut être considérablement réduite en utilisant des pointeurs.
C'est surtout vrai dans le fait que lorsque tu fais appel à une fonction prenant un objet en paramètre (j'entends par objet tout objet des langages orientés objet, toute structure, tout type primitif...), une copie de ton objet est placé dans la pile, et ça peut être très lourd (imagine un programme récursif par exemple). Avec les pointeurs, tu as moins de chances d'avoir un débordement de pile, et c'est plus performant car les objets à copier sont plus légers.
- tu peux écrire ce que tu veux dans la zone mémoire (tu connais la taille de la zone allouée), donc tu peux écrire ce que tu veux dans cette zone mémoire. C'est très puissant (tu as un contrôle énorme), mais très dangereux à la fois si tu ne gères pas bien tes pointeurs (si par exemple tu écris des données trop volumineuses, tu dépasses la zone mémoire allouée, et là soit tu as un segmentation fault, dans le meilleur des cas, soit tu écrases les données adjacentes à ta zone mémoire, ce qui généralement fait tout planter ;).
L'écrasement des données adjacentes peut aussi être intentionnel ! C'est une technique courante utilisée par les hackeurs (le buffer overflow), qui consiste à déclencher un comportement inattendu du programme, en utilisant un pointeur sur une zone mémoire, et en écrasant les données adjacentes avec des valeurs consciencieusement choisies.
En espérant t'avoir un peu éclairé.
Comme le dit KX, le pointeur est en fait l'adresse de ton objet en mémoire.
C'est à la fois très pratique et très contraignant :
- tu ne manipules plus qu'une adresse, donc un objet très léger (en général la taille d'un entier). Cela est super pratique dans le cas où tu as des structures de données assez lourdes, et que tu en as beaucoup : la mémoire utilisée peut être considérablement réduite en utilisant des pointeurs.
C'est surtout vrai dans le fait que lorsque tu fais appel à une fonction prenant un objet en paramètre (j'entends par objet tout objet des langages orientés objet, toute structure, tout type primitif...), une copie de ton objet est placé dans la pile, et ça peut être très lourd (imagine un programme récursif par exemple). Avec les pointeurs, tu as moins de chances d'avoir un débordement de pile, et c'est plus performant car les objets à copier sont plus légers.
- tu peux écrire ce que tu veux dans la zone mémoire (tu connais la taille de la zone allouée), donc tu peux écrire ce que tu veux dans cette zone mémoire. C'est très puissant (tu as un contrôle énorme), mais très dangereux à la fois si tu ne gères pas bien tes pointeurs (si par exemple tu écris des données trop volumineuses, tu dépasses la zone mémoire allouée, et là soit tu as un segmentation fault, dans le meilleur des cas, soit tu écrases les données adjacentes à ta zone mémoire, ce qui généralement fait tout planter ;).
L'écrasement des données adjacentes peut aussi être intentionnel ! C'est une technique courante utilisée par les hackeurs (le buffer overflow), qui consiste à déclencher un comportement inattendu du programme, en utilisant un pointeur sur une zone mémoire, et en écrasant les données adjacentes avec des valeurs consciencieusement choisies.
En espérant t'avoir un peu éclairé.
comment en disent que les pointeur a une grande capasité de memoire est nous nous l'avons déclaré (ex pointeur vers un enregistrement)
J'ai fait un tours sur google et voici ce que je viens de comprendre !!! si je me trempe corrigez moi :)
Voici un exemple :
#####################
TYPE pointeur=^type_de_la_variable_pointée
ex : TYPE tpoint=^tval; (* pointe sur des TVAL *)
tval=record
valeur:integer;
suivant:tpoint
end;
VAR p1:tpoint;
#####################
donc chaque fois quand écrit NEW(p1^) il nous alloue une mémoire d'un enregistrement puis on fait DISPOSE(p1^) pour finir et si on veux créer une autre enregistrement on fait NEW(p1^) est c'est pour ça quand dit que nous créant une grande memoire
est ce que je me trempe
si ca est vrais, si on a 10 enregistrement quand a créer 10 fois avec new(p1^) comment peut on aller au 4 enregistrement
merci
Voici un exemple :
#####################
TYPE pointeur=^type_de_la_variable_pointée
ex : TYPE tpoint=^tval; (* pointe sur des TVAL *)
tval=record
valeur:integer;
suivant:tpoint
end;
VAR p1:tpoint;
#####################
donc chaque fois quand écrit NEW(p1^) il nous alloue une mémoire d'un enregistrement puis on fait DISPOSE(p1^) pour finir et si on veux créer une autre enregistrement on fait NEW(p1^) est c'est pour ça quand dit que nous créant une grande memoire
est ce que je me trempe
si ca est vrais, si on a 10 enregistrement quand a créer 10 fois avec new(p1^) comment peut on aller au 4 enregistrement
merci
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 297
10 juin 2008 à 11:09
10 juin 2008 à 11:09
oui, c'est ça.
par contre, si tu fait 10 new, tu écrases à chaque fois.
Je ne sais plus très bien comment le pascal gère la mémoire, mais soit les valeurs de 1 à 9 sont effacer, soit elles sont perdu car elle ne sont récupérer nulle part.
Dans le deuxième cas, tu as une fuite de mémoire, c'est à dire que ton programme prend de plus en plus de place.
par contre, si tu fait 10 new, tu écrases à chaque fois.
Je ne sais plus très bien comment le pascal gère la mémoire, mais soit les valeurs de 1 à 9 sont effacer, soit elles sont perdu car elle ne sont récupérer nulle part.
Dans le deuxième cas, tu as une fuite de mémoire, c'est à dire que ton programme prend de plus en plus de place.