[debutant]Les pointeur [Résolu]

Signaler
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005
-
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
Bonjour



Suite a un de mes autres messages j'ai quelques question sur les pointeurs



1/Un pointeur represente bien une adresse d'une autre fonction ? Donc que designe ceci :

char *tab[100];



2/Soit txt un tableau (char txt[100])

char *ptr = txt;

ptr contien quoi ? l'integralite de txt ?



3/if(*ptr == ' ') donc si la position actuel de ptr est un espace le
programe rentre dans la boucle ? Mais alors ptr++ incremente ptr
de 1 mais comment savoir que c'est la position de ptr dans la chaine
txt ou ce que represente l'adresse de ptr



4/tab[i] = ptr; ptr contiens alors la position du mot mais comment ca
se fait que le mot qui suivent ne figure pas dans cette chaine ??



Je suis vraiment debutant donc pas la tete et je ne cherche qu'a comprendre



PS: voila le bout de code avec les pointeurs :



for(int j = 0; j < strlen(txt); j++)

{

if(*ptr == ' ')

{

*ptr = 0;

ptr++;

tab[i] = ptr;

i++;

j++;

}

ptr++;

}

22 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
tab[i] est un char*, et il pointe au même endroit que ptr, rien de plus a comprendre

tes erreurs son bizarres, elles parlent d'integer. Tu ne t'est pas trompé en déclarant txt?

La 2eme erreur c'est juste à cause du int j dans le for, déclare plutot j avant le for

int j;

for(j = 0; ...)
Messages postés
172
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2009

char *tab[100]; c un tableau de pointeur char de 100 entree

ptr contient l adresse de la premiere case de txt soit l adresse de txt[0]

*ptr represente la valeure de la variable a l adresse ptr, kan tu incremente ptr de 1 tu ogmente l adresse de 8 bits,si tu augmente *ptr de 1 tu ogmente de 1 la valeur pointé
par ptr

j comprend pas la 4 eme question

for(int j = 0; j < strlen(txt); j++) // on parcour la chaine
{
if(*ptr == ' ')// si le charactere pointé a la valeur d un espace
{
*ptr = 0; //alors on met le charactere pointé a 0
ptr++;//on ajoute 1 mot a l adresse
tab[i] = ptr; //la chepas ce qu on fait :p ca a pas de rapport ac ce qu il y a avant et c con :p de choper l adresse de chaque char
i++;
j++;
}
ptr++;
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
1) un pointeur contient une adresse, pas forcément celle d'une fonction. Ca peut aussi être une variable.

char* tab[100] est tableau contenant 100 char*. Il faut donc le voir comme un tableau et non un pointeur

2) ptr pointe vers le début du tableau txt. En gros c'est la même
chose, sauf que tu peux modifier ptr (ptr++), pas txt. Il faut que tu
gardes en mémoire que un pointeur contient juste une adresse. La taille
de ptr ne dépend pas de celle de txt. En ce sens un pointeur est
seulement un entier que tu interprètes différemment (tu l'intèrprètes
par indirection en général)

3) pas conpris la question

4) on a mis des 0 à la place des espaces, c'et pour ca que les mots qui
suivent n'apparaissent pas (c'est le caractère 0 ou '\0' qui marque la
fin d'un chaine)

Ca serait plus facile a expliquer avec un dessin
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
[auteurdetail.aspx?ID=240432 xboxut]> On chope pas tous les char*, juste ceux qui sont après un espace

Regarde le pb initial: http://www.cppfrance.com/forum.v2.aspx?ID=473941
Messages postés
172
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2009

c vrai dsl j me suis un poil emporte :p normal ossi apres une journee de revision du bac :D
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005

tab[i] = ptr;



Le truc que je comprend pas encore c'est que d'apres ce que vous m'avez dit

*ptr //valeur

ptr //position



donc tab[i]=ptr contienderais la position dans ptr :s je suis vraiment dsl ca je pige pas encore



Mais j'ai compris pour les autres question comme quoi tous n'est pas perdu :)



PS:J'ai un probleme lors de la compilation :s



char *ptr = txt;

c:42: warning: initialization makes pointer from integer without a cast



for(int j = 0; j < strlen(txt); j++)

error: 'for' loop initial declaration used outside C99 mode




for(int j = 0; j < strlen(txt); j++)

c:43: warning: passing arg 1 of `strlen' makes pointer from integer without a cast
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005

Voila le code que j'ai fais et je vois pas de txt :s



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <malloc.h>



void count();

void tri();

char txt[1000];



int main()

{

printf("\n\nEntrer le texte de votre choix\n\n");

fgets(txt,999,stdin);


printf("\nVous avez rentre : %s\n\n",txt);

count();



return(0);

}



void count()

{

int taille=strlen(txt);

int caract=strlen(txt);

int nb=0,i=0;



for(i;i<taille;++i)

{


if((txt[i]== ' ') || (txt[i] == '\'') || (txt[i] == ',')){

nb++;

caract--;}

}

nb++; //car pas d'esapace en fin de ligne



printf("Il y a : %d mot",nb);

printf("\nIl y a %d caractere (sans espace)",caract-1);

}

void tri(txt)

{



char *tab[100];

int i = 0;

char *ptr = txt;

int j;

for( j = 0; j < strlen(txt); j++)

{

if(*ptr == ' ')

{

*ptr = 0;

ptr++;

tab[i] = ptr;

i++;

j++;

}

ptr++;

}



}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
void tri(txt) tu a oublié de mettre le type, peut être qu'il le suppose en int?

tu dois mettre void tri(char* txt)

Ce txt masque celui que tu as deja en global
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005

Ah oui





Je vous remerci :)
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
pour reprendre toute ces question je ne comprend pas trop l'utiliter des pointeur
programmant en java la base et n'ayant pas de pointeur g du mal a voir une utilité

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
#include
#include <stdlib.h>


using namespace std;


void Affecter1(int j)
{
j = 3;
return;
}


void Affecter2(int *j)
{
*j = 3;
return;
}


int main()
{
int a=2;
int *i=&a;

printf("Valeur de a avant : %i\n", a);
//Passage par valeur
Affecter1(a);
printf("Valeur de a apres le passage par Affecter1() : %i\n", a);
//Passage par variable
Affecter2(i);
printf("Valeur de a apres le passafe par Affecter2() : %i\n", a);

return 0;
}

Quand même ça a de l'intérêt...


void Aurevoir( void ); //Bonne journée;
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
En Java on utilise des pointeurs sans s'en rendre compte. Pour autant
je préfère largement la possibilité qu'offre C++ de les utiliser
vraiment. C'est vraiment plus puissant, mais bien sur c'est aussi
dangereux si on ne sait pas trop ce qu'on fait.

Des qu'on travaille avec des chaînes, c'est très intéressant, rien a voir avec les String de Java.
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
ouais mais je trouve ca un peu lourd de devoir faire un pointeur sur une valeur en reference en plus ca nuit beaucoup a la lisiblite du code (enfin pour moi)
car comment vous traduiriez : int*i =&a; ? i pointe la reference de la valeur de a ?

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
mais je voi l'utilité maintenant et si g bien compris ca sert a modifier des valeur par des fontion sinon on ne peu les mmodifier

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
euh i est un entier qui pointe vers l'adresse de a non ?


void Aurevoir( void ); //Bonne journée
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
pkoi on a besoin de & alors ?

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
je n'avai pas vu ta rep vecchio56 je doit avouer que les flux son mieu maitrise en c++ qu'en java mais a quel prix !!!!! les code son illisible
et il n'y a que peut d'exemple concret de la puissance des pointeur du moins j'en voit peu et je doit avouer qu'en java on ne s'en rend pas compte et ca ne me rend pas malheureu c un peu comme les commendre preprocesseur : #ifndef,#define,#endif etc... c comme les pointeur : je ne voi pas trop a quoi ca sert
mais merci de m'avoir repondu

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Bé le & il dit que c'est l'adresse de a
parce que si tu fais, int *pi = a
il va avoir un problème d'allocation j'pense, à moins qu'en castant ca pourrait ptete marché...


void Aurevoir( void ); //Bonne journée
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
lol c pas a moi qu'il faut demander

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
je vien de tester ya bien un probleme de cast
mais donc & fait reference a la valeur d'une variable

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"