Les pointeur sur char

SlimJ -  
jackdada Messages postés 77 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

pourquoi avec une chaîne on peut écrire comme ça:

char *ch="bonjour";
printf("%s",ch)


alors que pour les entier on écrit:


int a=5;
int* p=&a;
printf("%d",*ch)


pour les chaine on prend pas ladresse.
si on ecrit comme ca printf("%d",p) pour les entiers ca donne ladresse mais non pas le contenu alors qu'avec les chaine ca donne le contenu ?
merci.





1 réponse

jackdada Messages postés 77 Date d'inscription   Statut Membre Dernière intervention   19
 
Bonjour,

Les chaine de caractère sont en réalité des tableau de char.

char *ch="bonjour";

avec ça tu réserve en mémoire l'espace nécessaire pour stocker bonjour.
Tu aurais très bien pu déclarer ta chaine des manière suivante:

char ch[8];
ch[0]='b';
ch[1]='o';
ch[2]='n';
ch[3]='j';
ch[4]='o';
ch[5]='u';
ch[6]='r';
ch[7]='\0';

ou

char ch[]="bonjour";


Concernant le concret de ta question qui porte sur la partie pointeur, ceci est dut au fait qu'une chaine de caractère n'est pas une simple variable mais un tableau et en a les même propriété de base. Donc quand tu demande l'affichage de ta chaine, ch donne en faite l'adresse de l'élément ch[0]. Tu obtient en retour ta chaine et non l'adresse car tu demande par le paramètre %s l'affichage d'une chaine, donc à partir de l'adresse du première élément de ton tableau (contenu dans ch), tu demande enfaite l'affichage de chaque élément (ch[0], ch[1]...) jusque la rencontre du caractère '\0'.

Tu t'est jamais posé la question de pourquoi quand je passe un tableau dans une fonction, je ne passe pas simplement une copie de ce dernier comme avec une variable et donc tout changement effectué sur ce tableau sont conservé en sortit de fonction. Ceci est du au fait que le simple nom de ton tableau contient en faite son adresse.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,
Les chaine de caractère sont en réalité des tableau de char.
Non, un tableau n'est pas un pointeur.
char ch[]="bonjour"; et char *ch="bonjour"; sont bel et bien différents, même s'ils se comportent de façon similaire dans la plupart des cas.

Ceci est du au fait que le simple nom de ton tableau contient en faite son adresse.
Plutôt que dans un contexte de fonction, le compilateur transforme le tableau en adresse sur le 1er élément.
0
jackdada Messages postés 77 Date d'inscription   Statut Membre Dernière intervention   19 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonjour,
Je n'est aucunement dit qu'un tableau était un pointeur...
Par contre je suis intéressé à connaitre la différence entre char ch[]="bonjour"; et char *ch="bonjour"; Sachant qu'il fournisse un résultat similaire qu'est ce qui les différencie? Il y a une différence dans la compilation de ces deux ligne de code? si oui qu'est ce qui s'y passe?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
char ch[]="bonjour";
Création d'un tableau de 8 caractères dans la stack et initialisation à 'b', 'o', ..., '\0';

char *ch="bonjour";
Création d'un pointeur dans la stack avec initialisation de sa valeur qui contient une adresse mémoire vers une zone en lecture seule présente dans le heap.
0
jackdada Messages postés 77 Date d'inscription   Statut Membre Dernière intervention   19
 
Merci pour ta réponse
0