[débutant][questionalacon] scanf et chaîne de caractères - C - Programmation
Marsh Posté le 22-11-2008 à 22:41:47
Ca dépend de ce qu'est la variable chaine. Si c'est un pointeur de type char* alors "chaine" est déjà une adresse, inutile de rajouter &.
Marsh Posté le 22-11-2008 à 22:46:35
C'est une chaîne de caractères.
Donc quelque chose de la forme
Code :
|
Marsh Posté le 22-11-2008 à 22:49:06
Ok donc même si ça n'est pas exactement la même chose, on est dans le même cas: chaine contient l'adresse du 1er caractère de ta chaine.
Marsh Posté le 22-11-2008 à 23:03:29
ok... je m'embrouille parce que chaine peut aussi désigner la chaîne de caractères dans son intégralité. ( avec un printf("%s",chaine) )
Mais tu es d'accord que &chaine donne aussi l'adresse du premier caractère de la chaîne ? ( je l'ai d'ailleurs vérifié avec un printf )
Ca serait différent si ma variable chaine était un pointeur de type char* ?
Marsh Posté le 22-11-2008 à 23:37:57
Oui il me semble que pour un tableau, avec ou sans & on obtient l'adresse du 1er élément. Pourquoi je ne sais pas.
Marsh Posté le 23-11-2008 à 10:57:54
Parce que c'est la norme C qui le veut, y a pas a chercher plus loin.
Aprés je te dirais qu'utilsiez scnaf quand ce genre de fondamentaux n'est aps acquis, c'est aimé se faire fesser avec un martinet à clous. fgets est plus adaptée et permet pus de controle. La , je vois le PO revenir demain en disant "ouais mon scanf bug, il mange pas les espaces".
Marsh Posté le 23-11-2008 à 11:23:40
ngkreator a écrit : Oui il me semble que pour un tableau, avec ou sans & on obtient l'adresse du 1er élément. Pourquoi je ne sais pas. |
disons que &chaine n'existe pas car il n'y a pas de pointeur vers la chaine en mémoire.
Ca n'aurait pas été plus logique d'interdire cette notation et de retourner une erreur non ?
Enfin, si la norme est faite comme ça tant pis.
Marsh Posté le 23-11-2008 à 11:54:11
c'est l'inverse : tout comme a->x est le raccourci de (*a).x, dans le cas des tableaux chaine est le raccourci de &chaine[0]. &chaine quant à lui doit *au moins* lever un warning car ca n'ets PAS DU TOUT pareil que &chaine[0]
Marsh Posté le 23-11-2008 à 11:59:16
c'est ce que je disais, j'ai dû mal m'exprimer.
Marsh Posté le 23-11-2008 à 12:00:56
Je ne sais pas si c'est à moi que tu parles Joel F mais j'essaye justement de comprendre les fondamentaux ( cf tag débutant ) et donc ici l'adresse (du premier élément) d'une chaîne ou d'un tableau.
Je pense que tout débutant commence en utilisant scanf plutôt que fgets...
sligor :
Citation : &chaine n'existe pas car il n'y a pas de pointeur vers la chaine en mémoire. |
Je ne comprends pas trop cette phrase...Quand on créé une variable , il n'y pas de pointeur vers cette variable en mémoire et pourtant on peut récupérer son adresse via & non?
A votre avis , j'ai plutôt rien compris aux pointeurs ou aux tableaux ? ( ou les 2? )
Marsh Posté le 23-11-2008 à 12:07:40
toji a écrit :
|
Sauf que ici c'est un cas particulier, "chaine" à le même type qu'un pointeur constant vers char.
et chaine n'existe pas en mémoire: seul le tableau de char exist ( chaine vaut &chaine[0])
&chaine serait en toute logique l'adresse d'une case mémoire stockant l'adresse de chaine[0]. Or une tel adresse n'existe pas.
Marsh Posté le 23-11-2008 à 12:10:14
Aaaaaaaaaaah d'accord.
C'est parce que j'ai pris l'habitude d'instancier mes tableaux avec [] j'en avais oublié que c'était des pointeurs.
Je pense avoir compris (pour le moment ) merci ^^
Marsh Posté le 23-11-2008 à 12:27:33
Ils ont le même type qu'un pointeur constant. Mais la différence c'est justement qu'ils n'existent pas réellement en mémoire.
Seule la donnée vers laquelle ils pointent existe
Marsh Posté le 23-11-2008 à 13:58:20
toji a écrit : |
Nooon, un tableau est un tableau, un pointeur est un pointeur !
Ce n'est asp la meme chose ! Ils sont juste compatible au niveau du type
Marsh Posté le 23-11-2008 à 14:22:13
Ok n'hésitez pas à me reprendre si je dis des grosses conneries
Marsh Posté le 24-11-2008 à 19:20:46
Joel F a écrit : c'est l'inverse : tout comme a->x est le raccourci de (*a).x, dans le cas des tableaux chaine est le raccourci de &chaine[0]. &chaine quant à lui doit *au moins* lever un warning car ca n'ets PAS DU TOUT pareil que &chaine[0] |
GCC émet un warning si on passe un mauvais type à scanf() et qu'il est bien réglé. Après je vois pas pourquoi ça devrait être obligatoire.
sligor a écrit : |
Pointeur sur tableau de char.
Marsh Posté le 24-11-2008 à 20:56:35
dap++ a écrit : |
oui, c'est bien ce que je dis non ?
Marsh Posté le 22-11-2008 à 22:07:49
J'ai juste une petite question qui grille mes quelques neurones encore présents :
Pourquoi lorsque l'on met une chaîne de caractères ( appelons-là chaine ) en paramètre d'un scanf faut-il mettre
et non
?
&chaine n'est pas une adresse ?
Malgré un warning , la 2eme version compile et fonctionne...
Merci d'éclairer ma lanterne.
Message édité par toji le 22-11-2008 à 22:09:17