[debutant]Les pointeur

Résolu
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005 - 3 juin 2005 à 17:57
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 - 4 juin 2005 à 22:03
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 juin 2005 à 19:13
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; ...)
3
xboxut Messages postés 172 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 27 novembre 2009 1
3 juin 2005 à 18:13
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++;
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 juin 2005 à 18:13
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 juin 2005 à 18:19
[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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xboxut Messages postés 172 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 27 novembre 2009 1
3 juin 2005 à 18:21
c vrai dsl j me suis un poil emporte :p normal ossi apres une journee de revision du bac :D
0
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005
3 juin 2005 à 18:54
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
0
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005
3 juin 2005 à 19:18
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++;

}



}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 juin 2005 à 19:22
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
0
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005
3 juin 2005 à 19:32
Ah oui





Je vous remerci :)
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
4 juin 2005 à 19:30
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"
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
4 juin 2005 à 20:03
#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;
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 juin 2005 à 20:33
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.
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
4 juin 2005 à 20:33
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"
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
4 juin 2005 à 20:35
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"
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
4 juin 2005 à 20:36
euh i est un entier qui pointe vers l'adresse de a non ?


void Aurevoir( void ); //Bonne journée
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
4 juin 2005 à 20:40
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"
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
4 juin 2005 à 20:45
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"
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
4 juin 2005 à 20:47
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
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
4 juin 2005 à 20:52
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"
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
4 juin 2005 à 20:54
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"
0
Rejoignez-nous