Question à propos d'un tuto
lulz
-
totof31 Messages postés 163 Date d'inscription Statut Membre Dernière intervention -
totof31 Messages postés 163 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai une petite quesiton a propos du tuto qui traite des liste simplement chainées: http://www.commentcamarche.net/faq/7444-liste-simplement-chainee
Dans la definition de la structure :
typedef struct ElementListe {
char *donnee;
struct ElementListe *suivant;
}Element;
Pourquoi, un pointeur est-il utilisé et non pas juste une chaine de caractere ?
Et dans les fonction, avant les instructions, il y une verification de l'allocation et en ce qui concerne la chaine de caractere, l'allocation est la suivante
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
== NULL)
Je ne comprends pas vraiment comment, en déclarant un pointeur(qui ne reserve pas de mémoire) on peut donner une valeur a cette variable (par un scanf("%d",donnee);)
Merci d'avoir lu ce message.
J'ai une petite quesiton a propos du tuto qui traite des liste simplement chainées: http://www.commentcamarche.net/faq/7444-liste-simplement-chainee
Dans la definition de la structure :
typedef struct ElementListe {
char *donnee;
struct ElementListe *suivant;
}Element;
Pourquoi, un pointeur est-il utilisé et non pas juste une chaine de caractere ?
Et dans les fonction, avant les instructions, il y une verification de l'allocation et en ce qui concerne la chaine de caractere, l'allocation est la suivante
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
== NULL)
Je ne comprends pas vraiment comment, en déclarant un pointeur(qui ne reserve pas de mémoire) on peut donner une valeur a cette variable (par un scanf("%d",donnee);)
Merci d'avoir lu ce message.
A voir également:
- Question à propos d'un tuto
- Tuto tableau croisé dynamique - Guide
- Tuto chromecast - Guide
- Tuto torrent - Guide
- Tuto rufus windows 11 - Guide
- Tuto table des matières word - Guide
2 réponses
Bonjour,
«Pourquoi, un pointeur est-il utilisé et non pas juste une chaine de caractere ?»
on peut placer une adresse dans la variable donnee, une adresse retournée par un malloc ou calloc (ou autre...) qui permet donc de pointer sur un bloc de bytes pouvant servir de tableau de char pour contenir une chaîne de caractères.
Comme je l'ai dis au dessus la variable donnee peut recevoir une adresse. Ici on peut voir qu'elle reçoit une adresse du début d'un bloc de taille 50 char, donnee pointe alors sur un "tableau" de 50 char en mémoire. On peut l'utiliser comme si c'était un :
Le scanf serait possible, un truc dans le genre :
«Pourquoi, un pointeur est-il utilisé et non pas juste une chaine de caractere ?»
char *donnee;
on peut placer une adresse dans la variable donnee, une adresse retournée par un malloc ou calloc (ou autre...) qui permet donc de pointer sur un bloc de bytes pouvant servir de tableau de char pour contenir une chaîne de caractères.
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char))) == NULL)
Comme je l'ai dis au dessus la variable donnee peut recevoir une adresse. Ici on peut voir qu'elle reçoit une adresse du début d'un bloc de taille 50 char, donnee pointe alors sur un "tableau" de 50 char en mémoire. On peut l'utiliser comme si c'était un :
char donnee[50];
Le scanf serait possible, un truc dans le genre :
scanf("%50s",donnee);
fiddy
Messages postés
11069
Date d'inscription
Statut
Contributeur
Dernière intervention
1 846
Voire même scanf("%49s", donnee); ;-)
Pour être parfaitement générique, on aurait pu remplacer
char *donnee;
par
void *donnee;
Ainsi, grâce à malloc, on alloue en fonction du besoin la place nécessaire, qui peut être comme ici une chaine de caractère, ou un entier, un flottant, un tableau de ce qu'on veut, ou une structure complexe, ou un tableau de structure, etc.
char *donnee;
par
void *donnee;
Ainsi, grâce à malloc, on alloue en fonction du besoin la place nécessaire, qui peut être comme ici une chaine de caractère, ou un entier, un flottant, un tableau de ce qu'on veut, ou une structure complexe, ou un tableau de structure, etc.
Oui, on peut très bien utiliser un pointeur de ce qu'on veut d'ailleurs.
Ce que j'essayai de faire comprendre (très maladroitement, je m'en accuse), c'était le caractère abstrait de la chose : une liste chainée peut concerner n'importe quel type de données... et réciproquement, quand on écrit du code générique on utilise plutôt void *
Ai-je été plus clair ? Ou je m'embrouille encore ?...
Ce que j'essayai de faire comprendre (très maladroitement, je m'en accuse), c'était le caractère abstrait de la chose : une liste chainée peut concerner n'importe quel type de données... et réciproquement, quand on écrit du code générique on utilise plutôt void *
Ai-je été plus clair ? Ou je m'embrouille encore ?...