Les pointeurs en C
axelvdk
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai une question sur les pointeurs en C, je comprends suffisamment les pointeurs pour savoir les utiliser mais c'est plus d'ordre théorique.
Je vais illustrer par un exemple :
struct L{char cLu; L *next;} *courant ; *deb; // de quoi faire une liste de lettre
deb=NULL; //initialisation et allocation memoire
deb=(struct L*)malloc(sizeof(struct));
deb->cLu='A';
crt=deb;
crt->next=(struct L*)malloc(sizeof(struct));
crt=crt->next;
Pour la suite de la liste j'utilise une boucle dans laquelle je mets juste pas ce qui correspond au pointeur deb.
Ma question est : comment se fait-il que crt=crt->next n'écrase rien ?
crt==A dès qu'il reçoit le deb, le suivant (crt->next) reçoit de la mémoire et que devient crt quand il reçoit crt->next ou la mémoire qui lui est allouée ?
Si quelqu'un a le temps de me répondre, c'est vraiment gentil à lui.
Merci de m'avoir lu,
Axel
J'ai une question sur les pointeurs en C, je comprends suffisamment les pointeurs pour savoir les utiliser mais c'est plus d'ordre théorique.
Je vais illustrer par un exemple :
struct L{char cLu; L *next;} *courant ; *deb; // de quoi faire une liste de lettre
deb=NULL; //initialisation et allocation memoire
deb=(struct L*)malloc(sizeof(struct));
deb->cLu='A';
crt=deb;
crt->next=(struct L*)malloc(sizeof(struct));
crt=crt->next;
Pour la suite de la liste j'utilise une boucle dans laquelle je mets juste pas ce qui correspond au pointeur deb.
Ma question est : comment se fait-il que crt=crt->next n'écrase rien ?
crt==A dès qu'il reçoit le deb, le suivant (crt->next) reçoit de la mémoire et que devient crt quand il reçoit crt->next ou la mémoire qui lui est allouée ?
Si quelqu'un a le temps de me répondre, c'est vraiment gentil à lui.
Merci de m'avoir lu,
Axel
1 réponse
Bonjour,
Attention aux struct. Vous l'utilisez mal.
struct L{char cLu; L *next;} *courant ; *deb;
Il ne faut pas oublier le struct pour définir *next. De plus, ne mets pas de ";" entre courant et deb.
deb=NULL; //initialisation et allocation memoire
Non, NULL n'alloue rien du tout.
deb=(struct L*)malloc(sizeof(struct));
Cette instruction réalise l'allocation et l'initialisation. Donc pas besoin de mettre deb à NULL juste avant. De plus le cast est superflue.
crt=deb
D'où sort crt ? C'est le pointeur courant j'imagine ?
comment se fait-il que crt=crt->next n'écrase rien ?
Comment ça ? malloc n'initialise pas la zone mémoire pointée. Donc pas d'écrasement. Ou alors précisez mieux votre question.
que devient crt quand il reçoit crt->next ou la mémoire qui lui est allouée ?
Beh crt devient prend la mémoire de crt->next, donc la valeur sera : crt->next->cLu, non intialisé ici.
Attention aux struct. Vous l'utilisez mal.
struct L{char cLu; L *next;} *courant ; *deb;
Il ne faut pas oublier le struct pour définir *next. De plus, ne mets pas de ";" entre courant et deb.
deb=NULL; //initialisation et allocation memoire
Non, NULL n'alloue rien du tout.
deb=(struct L*)malloc(sizeof(struct));
Cette instruction réalise l'allocation et l'initialisation. Donc pas besoin de mettre deb à NULL juste avant. De plus le cast est superflue.
crt=deb
D'où sort crt ? C'est le pointeur courant j'imagine ?
comment se fait-il que crt=crt->next n'écrase rien ?
Comment ça ? malloc n'initialise pas la zone mémoire pointée. Donc pas d'écrasement. Ou alors précisez mieux votre question.
que devient crt quand il reçoit crt->next ou la mémoire qui lui est allouée ?
Beh crt devient prend la mémoire de crt->next, donc la valeur sera : crt->next->cLu, non intialisé ici.