char *pString; pString = "Bonjour"; pourquoi ca marche ? - C - Programmation
Marsh Posté le 01-08-2013 à 15:42:55
"Bonjour" est un littéral de type const char*. Ton compilateur devrait t'interdire de le mettre dans pString si pString est de type char* pour cela il devrait te falloir un const cast ...
Mais oui, dans le principe, pString est une variable qui pointe sur une adresse (indéfinie au début puisque non initialisée) et tu peux la faire pointer sur la chaine de caractères que tu veux par la suite.
Edit : En C++ au moins, le littéral est un tableau, pas un pointeur ... J'ai un doute pour le C ...
Edit2 : peut-être que ca t'aidera de savoir que ta chaine est enregistrée dans l'exécutable que tu produis, qui, lui-même, est chargé en mémoire avant d'exécuter ton programme. Là, tu demandes à pString de pointer quelque part dans l'exécutable chargé en mémoire.
Marsh Posté le 01-08-2013 à 16:32:43
Code :
|
Pour une chaine littérale (qui ne sert pas à initialiser un tableau), le compilateur fait un truc du genre :
Code :
|
Ça veut dire que tu peux faire des trucs "amusants", du genre :
Code :
|
Petite différence toutefois: les chaines littérales sont en lecture seule. ie: *pString=0 => SEG FAULT.
Marsh Posté le 01-08-2013 à 16:48:35
tpierron a écrit : Pour une chaine littérale (qui ne sert pas à initialiser un tableau), le compilateur fait un truc du genre :
|
S'il faisait effectivement ca, *pString = 0 serait valide à l'exécution.
Marsh Posté le 01-08-2013 à 17:05:51
tpierron a écrit :
|
Hmmm ok, donc en fait, C permet une espèce de facilité d'écriture en tolérant qu'on mette dans pString autre chose qu'une adresse mémoire, mais dans l'absolu, la vraie facon d'initialiser un pointeur, c'est de declarer une variable avec ce qu'on veut dedans ("bonjour" ) puis de mettre l'adresse de cette variable dans pString... ?
Marsh Posté le 01-08-2013 à 17:21:57
doublebeurre a écrit : |
Non. pString n'accepte que des adresses (pointeurs). Ce sont les chaines littérales qui servent de raccourcis pour des tableaux statiques en lecture seule. Comme les tableaux se manipulent par adresse, une chaine littérale peut donc être vues comme une adresse, donc peut tout à fait servir à l'initialisation d'un pointeur. En faisant attention à ne pas modifier la chaine, d'où l'intérêt de déclarer les pointeurs sur chaine "const char *".
Marsh Posté le 01-08-2013 à 17:41:58
Ok, comment on peut voir ce que fait le compilateur et s'il re-arrange la declaration ?
Marsh Posté le 01-08-2013 à 18:26:33
On doit surtout lire la doc du langage, et en particulier le Kernighan & Ritchie.
Citation : 5.5 Character Pointers and Functions |
(K & R, 2e edition, p. 87)
A+,
Marsh Posté le 01-08-2013 à 19:02:40
gilou a écrit : On doit surtout lire la doc du langage, et en particulier le Kernighan & Ritchie.
(K & R, 2e edition, p. 87) |
Merci pour l'info, j'espere bien comprendre donc:
Code :
|
Donc ca met "now is time" dans un tableau de char (etape intermediaire)
et ensuite ca met l'adresse de ce tableau dans pmessage.
Marsh Posté le 01-08-2013 à 19:04:30
doublebeurre a écrit :
|
Oui et non : il n'y a pas de code pour faire ca, ce tableau est généré par le compilateur et stocké dans l'exe.
doublebeurre a écrit : |
Oui.
Marsh Posté le 01-08-2013 à 13:35:36
Bonjour,
je pensais avoir compris les pointeurs jusqu'au moment ou j'ai croisé des pointeurs de char/strings.
OK: pString est sensé contenir une adresse, non (par exemple 0x7fff74a98a48 )?
Par conséquent, pourquoi peut-on y mettre un (des) caracteres ??
Dans ce cas, je ne comprends pas pourquoi *pString ne devient pas, pour le compilateur:
valeur lue a l'adresse "Bonjour"... c'est a dire erreur.