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

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

Marsh Posté le 09-08-2003 à 11:49:19    

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
Reply

Marsh Posté le 09-08-2003 à 11:49:19   

Reply

Marsh Posté le 09-08-2003 à 12:19:00    

: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
Reply

Marsh Posté le 09-08-2003 à 12:21:40    

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?  
Reply

Marsh Posté le 09-08-2003 à 12:29:35    

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 ?)

Reply

Marsh Posté le 09-08-2003 à 12:34:26    

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?  
Reply

Marsh Posté le 09-08-2003 à 12:37:39    

donc un pointeur == une adresse ?

Reply

Marsh Posté le 09-08-2003 à 12:40:28    

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?  
Reply

Marsh Posté le 09-08-2003 à 12:49:54    

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 ?

Reply

Marsh Posté le 09-08-2003 à 12:58:56    

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
Reply

Marsh Posté le 09-08-2003 à 13:13:54    

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?  
Reply

Marsh Posté le 09-08-2003 à 13:13:54   

Reply

Marsh Posté le 09-08-2003 à 13:24:55    

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

Reply

Marsh Posté le 09-08-2003 à 13:25:48    

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?  
Reply

Marsh Posté le 09-08-2003 à 14:03:48    

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  :??:

Reply

Marsh Posté le 09-08-2003 à 14:12:38    

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

Reply

Marsh Posté le 09-08-2003 à 14:21:47    

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  ;)

Reply

Marsh Posté le 09-08-2003 à 14:58:32    

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.

Reply

Marsh Posté le 09-08-2003 à 15:09:41    

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

Reply

Marsh Posté le 09-08-2003 à 15:14:45    

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
Reply

Marsh Posté le 09-08-2003 à 16:01:56    

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?  
Reply

Marsh Posté le 09-08-2003 à 16:06:17    

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

Reply

Marsh Posté le 09-08-2003 à 16:09:59    

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?  
Reply

Marsh Posté le 09-08-2003 à 16:10:52    

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?

Reply

Marsh Posté le 09-08-2003 à 16:13:19    

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?  
Reply

Marsh Posté le 09-08-2003 à 18:21:12    

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
Reply

Marsh Posté le 09-08-2003 à 18:33:44    

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

Reply

Marsh Posté le 10-08-2003 à 02:07:17    

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

Reply

Marsh Posté le 10-08-2003 à 10:21:37    

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:

Reply

Marsh Posté le 10-08-2003 à 11:49:01    

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:

Reply

Marsh Posté le 10-08-2003 à 13:15:20    

oui d'accord  :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed