#1 Le 10/10/2017, à 10:36
- plouf1221
[RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu
Bonjour les ubuntiens,
Voila j'ai un petit souci et je ne comprends pas vraiment d’où il vient.
Je souhaite simplement afficher deux fois la même chaîne de caractere.
La première fois je n'ai aucun souci.
Mais la deuxième rien ne s'affiche pourtant je réinitialise bien mon pointeur en début de chaîne
et je réécris exactement le même bout de code.
Es ce que quelqu'un à une explication ?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char* tableau[] = {"premier", "deuxieme"};
char** p = tableau;
// Affichage de la deuxieme chaine de caractere
while (*p[1] != '\0')
{
printf("%c", *p[1]);
(p[1])++;
}
printf("\n");
// Réinitialisation du pointeur
p = tableau;
while (*p[1] != '\0')
{
printf("%c", *p[0]);
(p[1])++;
}
printf("\n");
return EXIT_SUCCESS;
}
Merci pour votre aide.
Dernière modification par plouf1221 (Le 10/10/2017, à 19:01)
Hors ligne
#2 Le 10/10/2017, à 11:17
- pingouinux
Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu
Bonjour,
Pour imprimer 2 fois la seconde chaîne :
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char* tableau[] = {"premier", "deuxieme"};
char** p = tableau;
char* p1_init = p[1]; // Ligne ajoutée
// Affichage de la deuxieme chaine de caractere
while (*p[1] != '\0')
{
printf("%c", *p[1]);
(p[1])++;
}
printf("\n");
// Réinitialisation du pointeur
// p = tableau;
p[1]=p1_init; // Ligne modifiée
while (*p[1] != '\0')
{
// printf("%c", *p[0]);
printf("%c", *p[1]); // Ligne modifiée
(p[1])++;
}
printf("\n");
return EXIT_SUCCESS;
}
Hors ligne
#3 Le 10/10/2017, à 17:06
- plouf1221
Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu
Mais lorsque je réinitialise le pointeur p avec la ligne suivante :
p = tableau;
C'est le même pointeur que p[1] puisque p[1] = *(p+1).
Je ne comprends pas pourquoi je suis obligé de prendre une nouvelle variable comme tu as fait pinguinux,
c'est à dire :
p[1] = p1_init;
Normalement si je réinitialise le pointeur p je réinitialise également p[1] puisque c'est le même pointeur.
Je ne comprends pas.
Dernière modification par plouf1221 (Le 10/10/2017, à 17:06)
Hors ligne
#4 Le 10/10/2017, à 17:41
- pingouinux
Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu
Avant la première boucle, tableau (et p) sont l'adresse du début d'un tableau à 2 éléments (les adresses de début des 2 chaînes de caractères).
Dans la première boucle, tu modifies p[1], qui va pointer successivement sur les caractères successifs de la second chaîne. Ni tableau ni p ne sont modifiés.
La seconde boucle n'est jamais parcourue, car p[1] pointe sur le caractère nul de la seconde chaîne.
Tu pourrais aussi faire ceci :
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char* tableau[] = {"premier", "deuxieme"};
char* p = tableau[1];
// Affichage de la deuxieme chaine de caractere
while (*p != '\0') { printf("%c", *p++); }
printf("\n");
// Réinitialisation du pointeur
p = tableau[1];
while (*p != '\0') { printf("%c", *p++); }
printf("\n");
return EXIT_SUCCESS;
}
Si tu veux en avoir le cœur net, tu peux imprimer les pointeurs à différents endroits du programme.
printf("p=%p tableau=%p\n",p,tableau);
printf("p[0]=%p p[1]=%p *p[0]=%02x *p[1]=%02x\n",p[0],p[1],*p[0],*p[1]);
Hors ligne
#5 Le 10/10/2017, à 18:09
- plouf1221
Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu
Dans la première boucle, tu modifies p[1], qui va pointer successivement sur les caractères successifs de la second chaîne. Ni tableau ni p ne sont modifiés.
C'est exaxtement cela que je ne comprends pas, je ne comprends pas comment c'est possible,
puisque p[1] = *(p+1)
Donc si je modifie p[1] je modifie forcément p et inversement.
Il n'y a bien qu'un seul pointeur.
Hors ligne
#6 Le 10/10/2017, à 18:37
- pingouinux
Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu
p est un pointeur sur un tableau de 2 éléments, qui sont eux-mêmes des pointeurs : p[0] et p[1] (ou *p et *(p+1)). Tu modifies le second élément de ce tableau, mais ne change pas le tableau lui-même.
Si tu as un tableau i de 2 entiers, et que tu modifies i[1], l'adresse de i ne change pas.
int i[]={10,20};
Hors ligne
#7 Le 10/10/2017, à 19:00
- plouf1221
Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu
C'est bon j'ai compris merci pinguinux.
Je modifie le pointeur p[1] via la ligne p[1]++;
Ensuite je suis sur le caractere de fin de chaine c'est pour cela que je n'arrive pas à imprimer deux fois.
Je suis obligé de stocké la position de mon pointeur celui qui est dans le tableau sans toucher à l'adresse du tableau.
C'est clair pour moi, merci encore.
Hors ligne