Les pointeur sur char

Fermé
SlimJ - 17 août 2015 à 01:35
jackdada Messages postés 76 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 - 18 août 2015 à 13:02
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 76 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 19
17 août 2015 à 06:22
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
17 août 2015 à 21:18
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 76 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 19 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
18 août 2015 à 02:44
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
18 août 2015 à 12:18
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 76 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 10 février 2016 19
18 août 2015 à 13:02
Merci pour ta réponse
0