Les pointeur sur char
SlimJ
-
jackdada Messages postés 77 Date d'inscription Statut Membre Dernière intervention -
jackdada Messages postés 77 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
pourquoi avec une chaîne on peut écrire comme ça:
alors que pour les entier on écrit:
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.
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.
A voir également:
- Les pointeur sur char
- Pointeur souris - Guide
- Curseur Windows 10 : comment bien voir la souris à l'écran - Guide
- Coco char - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Le pointeur de mon pc portable ne marche plus - Guide
1 réponse
Bonjour,
Les chaine de caractère sont en réalité des tableau de char.
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:
ou
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.
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.
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.
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?
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.