Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1723 connectés 

  FORUM HardWare.fr
  Programmation
  C

  char *pString; pString = "Bonjour"; pourquoi ca marche ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

char *pString; pString = "Bonjour"; pourquoi ca marche ?

n°2199184
doublebeur​re
Posté le 01-08-2013 à 13:35:36  profilanswer
 

Bonjour,
 
je pensais avoir compris les pointeurs jusqu'au moment ou j'ai croisé des pointeurs de char/strings.
 

Code :
  1. char *pString;
  2. pString="Bonjour";


 
OK: pString est sensé contenir une adresse, non (par exemple 0x7fff74a98a48 )?
 
 Par conséquent, pourquoi peut-on y mettre un (des) caracteres ??  [:urd]  
 
Dans ce cas, je ne comprends pas pourquoi *pString ne devient pas, pour le compilateur:
 

Citation :

valeur lue a l'adresse "Bonjour"... c'est a dire erreur.

mood
Publicité
Posté le 01-08-2013 à 13:35:36  profilanswer
 

n°2199192
theshockwa​ve
I work at a firm named Koslow
Posté le 01-08-2013 à 15:42:55  profilanswer
 

"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.


Message édité par theshockwave le 01-08-2013 à 16:06:55

---------------
last.fm
n°2199199
tpierron
Posté le 01-08-2013 à 16:32:43  profilanswer
 

Code :
  1. char *pString;
  2. pString="Bonjour";


 
Pour une chaine littérale (qui ne sert pas à initialiser un tableau), le compilateur fait un truc du genre :

Code :
  1. static char bonjour[] = "Bonjour";
  2.  
  3. pString = bonjour;


 
Ça veut dire que tu peux faire des trucs "amusants", du genre :

Code :
  1. pString = "Bonjour" + 3;
  2. char color = "CMYK"[3];


 
Petite différence toutefois: les chaines littérales sont en lecture seule. ie: *pString=0 => SEG FAULT.

n°2199200
theshockwa​ve
I work at a firm named Koslow
Posté le 01-08-2013 à 16:48:35  profilanswer
 

tpierron a écrit :

Pour une chaine littérale (qui ne sert pas à initialiser un tableau), le compilateur fait un truc du genre :

Code :
  1. static char bonjour[] = "Bonjour";
  2.  
  3. pString = bonjour;



 
S'il faisait effectivement ca, *pString = 0 serait valide à l'exécution.


---------------
last.fm
n°2199201
doublebeur​re
Posté le 01-08-2013 à 17:05:51  profilanswer
 

tpierron a écrit :

Code :
  1. char *pString;
  2. pString="Bonjour";


 
Pour une chaine littérale (qui ne sert pas à initialiser un tableau), le compilateur fait un truc du genre :

Code :
  1. static char bonjour[] = "Bonjour";
  2.  
  3. pString = bonjour;




 
 
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... ?

n°2199205
tpierron
Posté le 01-08-2013 à 17:21:57  profilanswer
 

doublebeurre 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... ?


 
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 *".

n°2199206
doublebeur​re
Posté le 01-08-2013 à 17:41:58  profilanswer
 

Ok, comment on peut voir ce que fait le compilateur et s'il re-arrange la declaration ?

n°2199210
gilou
Modérateur
Modzilla
Posté le 01-08-2013 à 18:26:33  profilanswer
 

On doit surtout lire la doc du langage, et en particulier le Kernighan & Ritchie.

Citation :

5.5 Character Pointers and Functions
A string constant, written as "I am a string" is an array of characters.  
In the internal representation, the array is terminated with the null character '\0' so that programs can find the end.  
The length in storage is thus one more than the number of characters between the double quotes.  
Perhaps the most common occurrence of string constants is as arguments to functions, as in printf("hello, world\n" );
When a character string like this appears in a program, access to it is through a character pointer; printf receives a pointer to the beginning of the character array.
That is, a string constant is accessed by a pointer to its first element.

String constants need not be function arguments.  
If pmessage is declared as char *pmessage; then the statement pmessage = "now is the time"; assigns to pmessage a pointer to the character array.  
This is not a string copy; only pointers are involved.
C does not provide any operators for processing an entire string of characters as a unit.

(K & R, 2e edition, p. 87)
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2199214
doublebeur​re
Posté le 01-08-2013 à 19:02:40  profilanswer
 

gilou a écrit :

On doit surtout lire la doc du langage, et en particulier le Kernighan & Ritchie.

Citation :

5.5 Character Pointers and Functions
A string constant, written as "I am a string" is an array of characters.  
In the internal representation, the array is terminated with the null character '\0' so that programs can find the end.  
The length in storage is thus one more than the number of characters between the double quotes.  
Perhaps the most common occurrence of string constants is as arguments to functions, as in printf("hello, world\n" );
When a character string like this appears in a program, access to it is through a character pointer; printf receives a pointer to the beginning of the character array.
That is, a string constant is accessed by a pointer to its first element.

String constants need not be function arguments.  
If pmessage is declared as char *pmessage; then the statement pmessage = "now is the time"; assigns to pmessage a pointer to the character array.  
This is not a string copy; only pointers are involved.
C does not provide any operators for processing an entire string of characters as a unit.

(K & R, 2e edition, p. 87)
 
A+,


 
 
Merci pour l'info, j'espere bien comprendre donc:
 

Code :
  1. pmessage = "now is the time"; //assigns to pmessage a pointer to the character array.


 
Donc ca met "now is time" dans un tableau de char (etape intermediaire)
et ensuite ca met l'adresse de ce tableau dans pmessage. :sweat:  
 
 

n°2199215
theshockwa​ve
I work at a firm named Koslow
Posté le 01-08-2013 à 19:04:30  profilanswer
 

doublebeurre a écrit :


 
 
Merci pour l'info, j'espere bien comprendre donc:
 

Code :
  1. pmessage = "now is the time"; //assigns to pmessage a pointer to the character array.


 
Donc ca met "now is time" dans un tableau de char (etape intermediaire)


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 :


et ensuite ca met l'adresse de ce tableau dans pmessage. :sweat:  


Oui.


---------------
last.fm

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  char *pString; pString = "Bonjour"; pourquoi ca marche ?

 

Sujets relatifs
[jquery] ca marche la première fois et pas les fois suivantesAttribut dir qui marche pas
[Résolu][ImageMagick] Passer une variable à convert : ne marche pas :([C] Remplacer un char dans une chaine de caractère
langage C - PB unsigned charsite html et css marche sous 7 FF17 et pas sous Ubuntu et FF17.0
int16_t[400] et char[400] xor en CPourquoi mon menu déroulant ne marche pas?
[C]Extraire un chiffre d'un tableau de char dans un intbonjour, problème synthax python sous idle
Plus de sujets relatifs à : char *pString; pString = "Bonjour"; pourquoi ca marche ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR