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

char *pString; pString = "Bonjour"; pourquoi ca marche ? - C - Programmation

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.
 

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.

Reply

Marsh Posté le 01-08-2013 à 13:35:36   

Reply

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.


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

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

Marsh Posté le 01-08-2013 à 16:32:43    

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.

Reply

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 :

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



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


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

Marsh Posté le 01-08-2013 à 17:05:51    

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

Reply

Marsh Posté le 01-08-2013 à 17:21:57    

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

Reply

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 ?

Reply

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
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é!  --
Reply

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.

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:  
 
 

Reply

Marsh Posté le 01-08-2013 à 19:04:30    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed