Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1551 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Un n-ieme sujet sur les pointeurs (theorie vers pratique)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Un n-ieme sujet sur les pointeurs (theorie vers pratique)

n°481945
antsite
Je me souviens
Posté le 09-08-2003 à 11:49:19  profilanswer
 

Salut,
Je me penche de plus pres sur les pointeurs et je dois faire face a quelques incomprehensions.
La theorie sur les pointeurs, je pense pouvoir dire que j'en ai connaissance, dans tous les livres sur le C elle est presente, a savoir :
char *pChar; >> pChar pointe sur un char, un pointeur de type char
&pChar >> adresse a laquelle pChar pointe
*pChar >> valeur de la variable pointee par char
 
je ne suis pas trop sur pour pChar >> pointe sur un char, char[] ?
 
bon une fois ca, je ne comprends pas tres bien dans la pratique : par exemple avec un simple scanf()
int i;
scanf("%d", &i)
MAIS
char tab[20];
scanf("%s", tab);
 
je ne comprends pas pourquoi pour un int, scanf veut son adresse, et pour un char ben il veut son adresse aussi mais pourquoi int a besoin de & alors que c'est pas un pointeur? bon pour le char, je comprends que c'est pas un pointeur, donc tab represente l'adresse du contenu, donc ca veut dire que il faut toujours travailler avec des adresses et non les valeurs ? (printf, prends comme argu tab, qui est une adresse?)
ouh la j'ai besoin de la lumiere de quelqu'un moi :)  
 
Bon apres je demanderais pour les arguments des fonctions, chaque chose en son temps
merci
    :hello:


Message édité par antsite le 09-08-2003 à 12:14:12
mood
Publicité
Posté le 09-08-2003 à 11:49:19  profilanswer
 

n°481953
polo021
Posté le 09-08-2003 à 12:19:00  profilanswer
 

:hello:  
Je vais esasyer de pas raconter trop de conneries ;)  
 
En fait un pointeur est une variable contenant une adresse comme tu l'as dit justement.
Quand tu fais
int* a;
int b;
a = &b;
 
a contient maintenant l'adresse de b.
Si tu fais *a = 10;  
le programme va voir sur quelle variable pointe a grace à l'adresse qu'elle contient et va mettre la valeur 10 à cet endroit => b sera egal à 10.
 
Pour les tableaux maintenant, c'est pareil. Il faut juste que tu saches que int tab[20] est une zone mémoire contigue qui est suffisament grande que pour y stocker 20 entiers. Et l'adresse de cette zone mémoire est tout simplement tab.
Si tu fais tab[5] = 1; ca équivaut à *(tab+5)=1;
Je décortique la derniere opération :
*(tab+5) = 1;
   tab est l'adresse de la zone mémoire comme dit plus haut,
   tab+5 : on prend l'adresse de la zone mémoire et on lui ajoute 5 (sous-entendu : 5 fois la taille d'un entier puisqu'on a un tableau d'entiers); ce qui va nous mener à l'adresse du 6ème entier qu'on peut stocker dans ce tableau.
  et "*" ben ca tu sais ce que c'est, c'est pour le contenu.
donc pour resumer, on met la valeur 1 dans la zone mémoire qui est à l'adresse tab+5
 
*(tab+5) est le 6eme élément parce que le premier element se trouve au debut du tableau evidemment, donc à l'adresse tab (tab+0 pour etre exact); tout simplement[:sinclaire]
 
 
voila pourquoi, quand tu fais un scanf, tu dois lui passer "tab" qui correspond bien à l'adresse de ton tableau.
 
Voila, j'espere avoir été compréhensible, si t'as des questions ou besoin d'eclaircissement, n'hésite pas :hello:


Message édité par polo021 le 09-08-2003 à 12:21:20
n°481954
jagstang
Pa Capona ಠ_ಠ
Posté le 09-08-2003 à 12:21:40  profilanswer
 

Ce qu'il faut savoir sur les char, c'est que le nom du tableau n'est autre qu'une adresse (l'adresse du premier caractère de la chaine)
 
C'est pour ça qu'en général, on apprend les pointeurs avant les chaines.
 
Donc :  
 
tab     >> adresse du premier élément
tab[0]  >> valeur du premier élément
&tab[0] >> adresse du premer élément
 
tab == &tab[0]


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°481960
antsite
Je me souviens
Posté le 09-08-2003 à 12:29:35  profilanswer
 

Oui merci ca m'eclaire bien ;)  
Par exemple voila ce que me dit msdn sur puts()
 

Code :
  1. int puts(
  2.    const char *string
  3. );


 
Je dois comprendre que puts veut comme argu un pointeur sur un char, mais donc il faut lui passer quoi comme argu, une adresse (genre tab), ou une valeur : *tab ?)

n°481962
jagstang
Pa Capona ಠ_ಠ
Posté le 09-08-2003 à 12:34:26  profilanswer
 

tu passes soit  
 
puts(tab)
 
soit
 
puts(&tab[0])
 
La première est bien sûr meilleure, si l'on sait ce qu'on manipule bien sûr !


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°481965
antsite
Je me souviens
Posté le 09-08-2003 à 12:37:39  profilanswer
 

donc un pointeur == une adresse ?

n°481970
jagstang
Pa Capona ಠ_ಠ
Posté le 09-08-2003 à 12:40:28  profilanswer
 

Les pointeur sont des varaibles qui contiennent comme valeur l'adresse d'une autre variable


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°481980
antsite
Je me souviens
Posté le 09-08-2003 à 12:49:54  profilanswer
 

ok, donc quand l'aide demande un pointeur il faut donner une adresse, ce que contient un pointeur en gros, mais il est aussi possible de donner bel et bien un pointeur et non une adresse?
char tab[20];
char *pTab = tab;
genre puts(pTab);
 
bon evidemment ici ca sert a rien... mais sinon ca va ?

n°481981
polo021
Posté le 09-08-2003 à 12:58:56  profilanswer
 

non enf ait ca fonctionne aps je pense, parce que tu lui donnes un pointeur sur pointeur or la focntion demande un pointeur tout seul.  
 mais là je suis pas assez bon que pour etre sur  :(  


Message édité par polo021 le 09-08-2003 à 13:02:49
n°481994
jagstang
Pa Capona ಠ_ಠ
Posté le 09-08-2003 à 13:13:54  profilanswer
 

ANTSite a écrit :

ok, donc quand l'aide demande un pointeur il faut donner une adresse, ce que contient un pointeur en gros, mais il est aussi possible de donner bel et bien un pointeur et non une adresse?
char tab[20];
char *pTab = tab;
genre puts(pTab);
 
bon evidemment ici ca sert a rien... mais sinon ca va ?


 
Non ça marche pas ça !!!
 
Dans tab[20], tab est déjà une adresse ! Avec ton ton exemple, tu passe l'adresse du pointeur de tab...


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
mood
Publicité
Posté le 09-08-2003 à 13:13:54  profilanswer
 

n°482002
antsite
Je me souviens
Posté le 09-08-2003 à 13:24:55  profilanswer
 

ok. bon je vais me donner un petit temps pour cogiter ca  :hello:

n°482004
jagstang
Pa Capona ಠ_ಠ
Posté le 09-08-2003 à 13:25:48  profilanswer
 

vas voir dans la biblio links, il y a surement des bons tutos sur les pointeurs. Sinon un bouquin


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°482014
antsite
Je me souviens
Posté le 09-08-2003 à 14:03:48  profilanswer
 

quand une fonction demande comme argument un pointeur, il faut lui filer une adresse >> c'est bon ca deja?
Maintenant si on lui passe directement une chaine ca marche, ca veut dire quoi en fait, si c'est une chaine c'est pas une adresse  :??:

n°482016
polo021
Posté le 09-08-2003 à 14:12:38  profilanswer
 

ANTSite a écrit :

quand une fonction demande comme argument un pointeur, il faut lui filer une adresse >> c'est bon ca deja?
Maintenant si on lui passe directement une chaine ca marche, ca veut dire quoi en fait, si c'est une chaine c'est pas une adresse  :??:  


oui c'est ca.
une chaine c'est une adresse aussi. une chaine, c'est un tableau de caractère.
Poste ton code pour qu'on en soit sur

n°482018
antsite
Je me souviens
Posté le 09-08-2003 à 14:21:47  profilanswer
 

ok, une chaine c'est une adresse tout comme tab des exemples ci dessus.
ben le code pour rester dans la meme ligne:
fputs("la chaine" );
 
Pour reprendre avec int,
int b;
ici contrairement a char tab[20]; b n'est pas une adresse mais une valeur?
Je pense que ca sera ma derniere question pour comprendre le truc  ;)

n°482030
Kristoph
Posté le 09-08-2003 à 14:58:32  profilanswer
 

ANTSite a écrit :

ok, donc quand l'aide demande un pointeur il faut donner une adresse, ce que contient un pointeur en gros, mais il est aussi possible de donner bel et bien un pointeur et non une adresse?
char tab[20];
char *pTab = tab;
genre puts(pTab);
 
bon evidemment ici ca sert a rien... mais sinon ca va ?


 
Ce code marche bien normallement.
 
Une variable de type entier est une variable qui contient un entier.
Une variable de type pointeur sur entier est une variable qui contient l'addresse d'un entier en mémoire.
Une chaine de caractères en C est équivalent à l'addresse du premier caractère de cette chaine. Et bien sur, il faut que cette chaine se termine par un '\0'
Un tableau est pratiquement équivalent à un pointeur. Là ou l'on te demande un pointeur, en général tu peux lui donner un tableau et ça marche. C'est ce qu'on appèle une convertion implicite du type tableau sur qq chose vers le type pointeur sur qq chose.

n°482034
polo021
Posté le 09-08-2003 à 15:09:41  profilanswer
 

ANTSite a écrit :

ok, une chaine c'est une adresse tout comme tab des exemples ci dessus.
ben le code pour rester dans la meme ligne:
fputs("la chaine" );
 
Pour reprendre avec int,
int b;
ici contrairement a char tab[20]; b n'est pas une adresse mais une valeur?
 


oui

n°482035
polo021
Posté le 09-08-2003 à 15:14:45  profilanswer
 

Kristoph a écrit :


 
Ce code marche bien normallement.


testé et approuvé  :jap:

Code :
  1. #include "stdafx.h"
  2. #include <string.h>
  3. int main(int argc, char* argv[])
  4. {
  5. char tab[20];
  6. char *pTab = tab;
  7. strcpy(tab,"voici le tableau" );
  8. puts(pTab);
  9. return 0;
  10. }


Message édité par polo021 le 09-08-2003 à 15:15:57
n°482042
jagstang
Pa Capona ಠ_ಠ
Posté le 09-08-2003 à 16:01:56  profilanswer
 

Pas besoin d'utiliser un pointeur dans ce cas..
 

Code :
  1. #include <string.h>
  2.   int main(int argc, char* argv[])
  3.   {
  4.      char tab[20];
  5.      strcpy(tab,"voici le tableau" );
  6.      puts(tab);
  7.      return 0;
  8.   }


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°482043
polo021
Posté le 09-08-2003 à 16:06:17  profilanswer
 

[:rofl]
evidemment  :sarcastic:  
c'etait juste pour tester que ca fonctionnait  :pfff:

n°482045
jagstang
Pa Capona ಠ_ಠ
Posté le 09-08-2003 à 16:09:59  profilanswer
 

je me disais. je voyais pas le sens de l'exercice


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°482047
antsite
Je me souviens
Posté le 09-08-2003 à 16:10:52  profilanswer
 

oui  :)  
 
bon c'est peut etre vite dit mais... grace a vous j'ai compris les pointeurs!!
 
 :hello:  
 
est-ce que vous jugez que l'on doit savoir autre chose sur le sujet, je veux dire il reste encore des trucs pour faire le tour des pointeurs?

n°482048
jagstang
Pa Capona ಠ_ಠ
Posté le 09-08-2003 à 16:13:19  profilanswer
 

moi je trouve simple d'une fois qu'on a capté le truc. mais rien t'empêche de t'exercer toutefois.
 
Je te propose de faire une fonction qui te retournes le min et le max d'un tableau d'entier. prototype :
 
void minmax(int *tab, unsigned taille, int *min, int *max) ;
 
et d'afficher le min et le max dans la main
 
Si tu y arrives c'est bon tu as pigé


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°482081
mrbebert
Posté le 09-08-2003 à 18:21:12  profilanswer
 

ANTSite a écrit :

...
char *pChar; >> pChar pointe sur un char, un pointeur de type char
&pChar >> adresse a laquelle pChar pointe
*pChar >> valeur de la variable pointee par char
...

:heink:  
Le & permet de prendre l'adresse de la variable, qui est ici un pointeur. Donc, &pChar représente l'adresse d'un pointeur (un char **) :pt1cable:  
 
L'adresse vers laquelle pChar pointe, c'est pChar


Message édité par mrbebert le 09-08-2003 à 18:21:39
n°482084
polo021
Posté le 09-08-2003 à 18:33:44  profilanswer
 

mrBebert a écrit :

:heink:  
Le & permet de prendre l'adresse de la variable, qui est ici un pointeur. Donc, &pChar représente l'adresse d'un pointeur (un char **) :pt1cable:  
 
L'adresse vers laquelle pChar pointe, c'est pChar


exact, j'avais pas fait gaffe a ca

n°482281
antsite
Je me souviens
Posté le 10-08-2003 à 02:07:17  profilanswer
 

ah oui en effet, mais maintenant c'est du passe ce genre d'erreur  :)  
bon je vais bientot poster le code pour minmax  ;)

n°482316
antsite
Je me souviens
Posté le 10-08-2003 à 10:21:37  profilanswer
 

Code :
  1. #include <stdio.h>
  2. void minmax(int *tab, unsigned taille, int *min, int *max)
  3. {
  4. int i;
  5. int tmp = 0;
  6. for(i=0;i<taille;i++)
  7. {
  8.  if(tab[i] > tmp)
  9.   tmp = tab[i];
  10. }
  11. *max = tmp;
  12. for(i=0;i<taille;i++)
  13. {
  14.  if(tab[i] < tmp)
  15.   tmp = tab[i];
  16. }
  17. *min = tmp;
  18. }
  19. int main(void)
  20. {
  21. int iMin, iMax;
  22. int iTab[] = {3, 6, 2, 1, 3, 0};
  23. printf("Calcul Min / Max d'un tableau d'entiers\n\n" );
  24. minmax(iTab, sizeof(iTab)/sizeof(int), &iMin, &iMax);
  25. printf("Min: %d\nMax: %d\n", iMin, iMax);
  26. return 0;
  27. }

 
 
ca marche, maintenant est-ce qu'il y a des choses a redire? par exemple sizeof(iTab)/sizeof(int)  :heink:

n°482339
polo021
Posté le 10-08-2003 à 11:49:01  profilanswer
 

je pense qu'il n'y a rien a redire a ce code si ce n'est l'initialisation de tmp à 0. Ca va foirer si tu as des negatifs dans ton tableau.
Soit tu l'initialises à la valeur du premier element du tableau soit à la constante INT_MIN qui se trouve dans LIMITS.h
 :hello:

n°482377
antsite
Je me souviens
Posté le 10-08-2003 à 13:15:20  profilanswer
 

oui d'accord  :jap:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Un n-ieme sujet sur les pointeurs (theorie vers pratique)

 

Sujets relatifs
drag and drop d'un attach Outlook vers mon appli VBajouter un lien vers une page si sa derniere modif a moins de 15j
de l'AS400 (fichier .tto) vers VBA (Excel)[VB] contenu d'une picturebox vers une image ? [résolu !]
Exportation de donnée de Word vers Access[HTML] form : envoyer vers une page php, ou vers une autre
[JS] Lien vers window.openlien vers nouvelle fenetre sans menu, comme une popup ...
petite question de logique sur les pointeursPtit truc pratique en PHP
Plus de sujets relatifs à : [C] Un n-ieme sujet sur les pointeurs (theorie vers pratique)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR