IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

pointeurs (explications)


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Points : 51
    Points
    51
    Par défaut pointeurs (explications)
    Bonjour

    Voilà, je sais à quoi sert un pointeur mais je n'ai rien compris à la manière de l'utiliser, ni comment on doit raisonner avant de l'utiliser, comme l'écrire de point de vue synthaxique. Je n'y arrive pas du tout avec les pointeurs et donc si vous pourriez m'expliquer les pointeurs à votres manières SVP, je comprendrai ptet mieux.
    je n'arirve pas à raisonner et écrire des pointeurs ds mes progs. voilà.
    merci de bien vouloir me répondre.

  2. #2
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Utilisation n°1: Permettre à une fonctions de retourner plusieurs valeurs.
    Exemple: fonction retournant la somme et le produit de 2 fonctions
    Dans ce cas je me sers des pointeurs pour passer l'adresse de variables existant dans la fonction appelante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void f(int a, int b, int *som, int *prod){
    /* som et prod contiennent l'adresse de 2 entiers, afin qu'ils soient modifiés directement au bon endroit en mémoire */
    *som = a+b;  /*je mets a+b en mémoire à l'adresse contenue dans som*/
    *prod = a*b; ;  /*je mets a*b en mémoire à l'adresse contenue dans prod*/
     
    }
     
    int main() {
    int nb1, nb2, s, p;
    nb1= 2;
    nb2 =3;
    f(nb1, nb2, &s, &p);  /* je passe l'adresse de s et p pour que le contenu de ces 2 variables soit modifié par la fonction f */
    printf("somme= %d, produit= %d\n", s, p);
    return 0;
    }
    Utilisation 2:
    J'ai besoin de réserver de la place pour un tableau dont je ne connais a priori pas la taille. Je vais donc allouer dynamiquement de la place en cours d'exécution pour ce tableau.
    Le pointeur me sert ici pour connaitre l'adresse du 1er élément du tableau.

    Exemple: somme de 2 vecteurs d'entiers de taille quelconque:c = a + b
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    int main() {
    int taille, i;
    int *a, *b, *c;
    printf("entrez la taille des vecteurs\n");
    scanf("%d", &taille); // tu reconnais ici l'utilisation de l'exemple 1
     
    /* Reservation de la place pour les vecteurs a, b et c 
    malloc réserve la place mémoire indiquée en paramètre et renvoie son adresse en mémoire */
    a = (int *)malloc(taille * sizeof(int));
    b = (int *)malloc(taille * sizeof(int));
    c = (int *)malloc(taille * sizeof(int));
     
    /* Calcul de la somme */
    for &#40;i=0;i<taille;i++&#41;
       c&#91;i&#93; = a&#91;i&#93; + b&#91;i&#93;
     
    &#125;
    Il y a d'autres utilisations mais essaie déjà de comprendre ces 2 là, c'est la base.
    Bon courage!

  3. #3
    Membre régulier Avatar de Hypnos
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 87
    Points : 108
    Points
    108
    Par défaut
    salut,

    tu dois te dire que cette syntaxe :
    signifie que pi est un pointeur sur un int.

    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i, *pi;
    pi = &i ;
    *pi = 5;
    alors i = 5, car pi est un pointeur sur un int, alors que *pi représente l'int sur lequel il pointe.
    On donne à pi l'adresse de i par
    donc à la 3ème ligne, puisque *pi représente un int, et qu'il pointe sur i par la ligne précédente, i = 5
    Errare humanum est ... sed humanus naturae erratum est.

  4. #4
    Nouveau membre du Club

    Inscrit en
    Mars 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 21
    Points : 35
    Points
    35
    Par défaut
    Je vais essayer à mon tour de t'expliquer simplement :

    Quand tu déclares une variable
    i est une variable qui est allouée dans le tas (zone de mémoire) et cette variable est contenue dans une (ou plusieurs "cases mémoire" selon la longueur).
    Cette case mémoire a une adresse et une seule.
    est l'adresse de la case mémoire contenant la variable.
    On peut faire la comparaison avec les raccourcis Windows vers les fichiers (plusieurs raccourcis peuvent POINTER vers un fichier).

    Quand tu déclare un pointeur sur une variable

    pi sera le pointeur vers un entier dont le contenu est *pi.

    (pi est le raccourci et *pi est le fichier pointé)

    ATENTION : Tu ne peux pas mettre quelque chose dans *pi : tu auras une erreur de segmentation (core dumped, memory fault...) parce que tu n'auras pas alloué de la place dans le tas.

    Il faut donc allouer dynamiquement de la mémoire avec malloc() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pi = &#40;int*&#41;malloc&#40;sizeof&#40;int&#41;&#41; ;
    où malloc() va se charger d'allouer la mémoire nécessaire pour un int et te retourner le pointeur qui pointe sur celui-ci.

    Pour les chaines de caractères, je pourrai t'en dire d'avantage si tu le demandes !

    A bientot

  5. #5
    Membre actif
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 121
    Points : 217
    Points
    217
    Par défaut
    Lorsque tu ecris une fonction genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void echange&#40;int a, int b&#41;&#123;
      int temp;
      temp = a;
      a = b;
      b = temp;
    &#125;
     
    int main&#40;void&#41;&#123;
       int a,b;
     
       a = 1;
       b = 2;
       echange&#40;a,b&#41;;
       printf&#40;"a = %d , b = %d", a, b&#41;;
    &#125;

    Au premier coups d'oeil tu te dit que le resultat sera:
    a = 2 , b = 1

    Et bien non car le passage des arguments à la fonction s'est fait par valeurs

    je m'explique.
    Lors de l'exécution de la fonction echange
    Il va être créé deux variables "locales" a et b, correspondant aux arguments de la fonction, mais la portée de ces variable se limitera
    à la fonction échange, c'est a dire que dès que la fonction sera terminée
    a et b de cette fonction n'existeront plus et on retrouvera les a et b de main avec leur valeur initiale.

    Pour résoudre ce problème voici la soluce



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void echange&#40;int *a, int *b&#41;&#123;
      int temp;
      temp = *a;
      *a = *b;
      *b = temp;
    &#125;
     
    int main&#40;void&#41;&#123;
       int a,b;
     
       a = 1;
       b = 2;
       echange&#40;&a,&b&#41;;
       printf&#40;"a = %d , b = %d", a, b&#41;;
    &#125;
    Voila maintenant lorsque tu appels echange ce n'est plus la valeur de a et b que tu envois mais leur adresse (avec &a, &b)

    et en faisant *b = *a;
    dans echange cela correspond a faire prendre au contenu de l'adresse b le contenu de l'adresse a.

    Ce n'est qu'un exemple d'utilisation parmis tant d'autre.

    Mais a mon avis tu trouveras les utilisation des pointeurs lorsque tu commencera à tater des fonctions telles que malloc(), memcpy(), et toutes les fonctions qui permettent de gerer la memoire de facon dynamique. Avec un peu de patience et beaucoups de dessin dans un premier temps, tu deviendras le maître des pointeur( a moins que ca ne soit eux qui deviennent maîtres de toi ...).

    Cherche aussi de la doc sur le net, tu ne devrais pas être deçu du voyage.
    Je connais des gens qui ne sont pas aware, il ne sont pas qu courant. il ne sont pas a l'attention de savoir qu'ils existent.
    "J-C Van dam"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/07/2014, 15h21
  2. Besoin d'une explication sur les pointeurs
    Par ToTo13 dans le forum C
    Réponses: 6
    Dernier message: 04/10/2008, 11h41
  3. Pointeurs : explications
    Par olyver dans le forum Langage
    Réponses: 3
    Dernier message: 25/04/2008, 18h18
  4. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 01h44
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 23h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo