[C] Les pointeurs, oui mais...

Nilfheim Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour amis programmeurs,

Voila je viens d'apprendre a créer des pointeurs, je sais par ailleurs que ces "variables" permettre de recuperer l'adresse d'une variable, d'y aller et de remplacer/donner la valeur d'une varaible. Jusque la pas de soucis, le probleme etant: Dans quel(s) cas de figure les utiliser? En effet, jusqu'a maintenant je m'en sortait tres bien avec de simple &variable, bien que mes programmes soient pour le moment basique, j'en convient.

Une âme charitable pourait t'elle m'éclairer?

Merci : )

5 réponses

mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
U pointeur ne permet pas de récupérer une adresse : c'est une adresse ! Cette adresse est de taille relaativement modeste mais peut pointer une structure très lourde.

Or tu sais que lors d'un appel de fonction, les paramètres de cette fonction sont recopiés dans la pile mémoire :
- une fonction ne peut donc pas modifier un paramètre (ou plus exactement seule la recopie sera modifiée, donc le changement ne sera visible que tant qu'on sera dans la fonction)
- si le paramètre est très gros on perd du temps

A ce stade tu vois donc qu'un pointeur est rentable pour passer en paramètre que l'on souhaite modifier ou qui sont très long à recopier. Notons qu'en C++ (et en java même si ça ne se voit pas) on utilise plutôt des références mais l'idée reste la même.

Ajoutons à cela qu'un tableau d'entier est de type int* (on passe l'adresse de la première case du tableau) et tu as une application supplémentaire des pointeur. Car lorsqu'on connaît la taille du tableau avant la compilation on peut s'en sortir avec un tableau de taille statique (genre int tab[10]) mais sinon il faut utiliser la fonction malloc ou calloc... qui renvoient toute deux des pointeurs ;)

Bonne chance
0
Nilfheim Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup :)
Bon je t'avouerais que pour le moment ca me parle pas trop, vu la taille de mes programmes... Mais je suis sur que dans l'avenir je pourais pas m'en passer ^^
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Ce n'est pas une question de taille ! Exemple
#include <stdio.h>
#include <stdlib.h>

void incrementer_nok(int i){
  ++i;
  printf("incrementer_nok : %d\n",i);
}

void incrementer_ok(int *i){
  ++(*i);
  printf("incrementer_ok : %d\n",*i);
}

int main(){
  int j=0;
  int k=0;
  incrementer_nok(j);
  incrementer_ok(&k);
  printf("j=%d\n",j);
  printf("k=%d\n",k);
  return 0;
}

Exemple 2 :
#include <stdio.h>
#include <stdlib.h>

typedef double[100000] gros_truc;

void f(gros_truc gt){}
void g(gros_truc * gt){}

int main(){
  int i;
  gros_truc gt;
  printf("Debut pas top\n");
  for(i=0;i<10000;++i) f(gt);
  printf("Fin pas top\n");
  printf("Debut top\n");
  for(i=0;i<10000;++i) g(&gt);
  printf("Fin top\n");
  return 0;
}

J'espère que te voilà convaincu ;)

Bonne chance
0
Nilfheim Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
 
Si j'ai bien compris, on ne peut utiliser deux fonctions en meme temps si on met pas de pointeur? Si c'est ca, effectivement, tu as eclairer ma lanterne. C'est totalement indispensable en fait.
0

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

Posez votre question
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Le C ne permet pas de lancer des fonctions en même temps, tout se passe de manière séquentielle sauf si tu utilises des threads ou des fork (mais on n'en est pas là).

Le premier exemple montre que si tu souhaite modifier la valeur d'un paramètre, il faut passer par un pointeur.

Le second exemple montre qu'au niveau des performance, un pointeur se recopie plus vite en mémoire qu'un tableau de 10000 doubles. Il faut lancer et compiler les deux programmes pour bien comprendre ce qui se passe.

Bonne chance
0