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 :

Exercices pour débutants : pointeurs


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut Exercices pour débutants : pointeurs
    Bonjour a tous!

    Voila, je suis nouveau sur ce forum et j'essai actuellement d'apprendre la programmation en C! Mais j'ai vraiment beaucoup de mal

    Bref, je connais les bases telles que les fonctions, les boucles, les conditions, mais je dois bien avoué que je bloque au niveau des.... pointeurs!


    Bref, j'esperais que vous pourriez me venir en aide afin de me donner des exercices "simples" reprenant les prototypes, et surtout les pointeurs.


    Dernière question... Combien de temps vous a t il fallu pour etre a l'aise dans ce langage? et comment vous etes vous motivé?


    Merci a tous!

  2. #2
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut
    C'est avec un tuto (tres tres bien fait) que j'essai d'apprendre!

    Disons que ce n'est pas exactement un probleme de compréhension. De ce que j'ai compris, les pointeurs sont en fait des variables a qui on donne non pas une valeur mais l'adresse d'une autre variable.


    Ce tuto est tres bien expliqué, mais j'ai du mal a me rendre compte reellement de l'utilité des pointeurs, pourtant, je sais que c'est LE point fondamental du langage en C.

    C'est pour cela que j'aurais reellement besoin d'une application. La théorie ca va un moment, mais le plus important, ne reste t-il pas la pratique?

  3. #3
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Tout d'abord, merci pour ton aide!

    Justement, c'est avec ce tuto (tres tres bien fait) que j'essai d'apprendre!

    Disons que ce n'est pas exactement un probleme de compréhension. De ce que j'ai compris, et tu peux me dire si je me trompe mais les pointeurs sont en fait des variables a qui on donne non pas une valeur mais l'adresse d'une autre variable.


    Ce tuto est tres bien expliqué, mais j'ai du mal a me rendre compte reellement de l'utilité des pointeurs, pourtant, je sais que c'est LE point fondamental du langage en C.

    C'est pour cela que j'aurais reellement besoin d'une application. La théorie ca va un moment, mais le plus important, ne reste t-il pas la pratique?
    De rien.

    Une variable pointeur est comme tu l'indiques destinée à recevoir l'adresse d'une autre variable.

    Je suis aussi débutant en C et je peux te dire que depuis que je joue avec les pointeurs, je ne sais plus m'en passer.

    C'est tout simplement facile et efficace.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char Nom[100]={"Bonjour tout le monde"};
     
    Char* PremierO = strchr(Nom,'o');
     
    PremierO* = 'a';
    Je t'explique en vitesse :

    strchr renvoie l'adresse du premier o trouvé dans le tableau Nom.

    Ta variable PremierO contient donc une adresse, celle du premier o se trouvant dans le tableau.

    Tu peux ensuite te mettre directement sur cette adresse (PremierO*) et lui affecter ce que tu veux.

    Tu peux aussi aller un caractère plus loin PremierO++; PremierO* = 'a'

    Il y'a plein d'avantage à utiliser les pointeurs, l'un d'entre eux est de pouvoir travailler directement sur la valeur des variables et non sur une copie, cela te permet donc de changer la valeur de plusieurs variable dans la même fonction (une fonction void par exemple).

    Je vais t'envoyer un exercice si tu veux (mais on utilise les structure) dis moi d'abord si tu connais les structures.

    La pratique est de loin LE PLUS IMPORTANT ! c'est comme ça qu'on peut réellement apprendre le C, un minimum de théorie et un maximum de pratique.

    @+

    beegees

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut
    Citation Envoyé par beegees Voir le message
    De rien.

    Une variable pointeur est comme tu l'indiques destinée à recevoir l'adresse d'une autre variable.

    Je suis aussi débutant en C et je peux te dire que depuis que je joue avec les pointeurs, je ne sais plus m'en passer.

    C'est tout simplement facile et efficace.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char Nom[100]={"Bonjour tout le monde"};
     
    Char* PremierO = strchr(Nom,'o');
     
    PremierO* = 'a';
    Je t'explique en vitesse :

    strchr renvoie l'adresse du premier o trouvé dans le tableau Nom.

    Ta variable PremierO contient donc une adresse, celle du premier o se trouvant dans le tableau.

    Tu peux ensuite te mettre directement sur cette adresse (PremierO*) et lui affecter ce que tu veux.

    Tu peux aussi aller un caractère plus loin PremierO++; PremierO* = 'a'

    Il y'a plein d'avantage à utiliser les pointeurs, l'un d'entre eux est de pouvoir travailler directement sur la valeur des variables et non sur une copie, cela te permet donc de changer la valeur de plusieurs variable dans la même fonction (une fonction void par exemple).

    Je vais t'envoyer un exercice si tu veux (mais on utilise les structure) dis moi d'abord si tu connais les structures.

    La pratique est de loin LE PLUS IMPORTANT ! c'est comme ça qu'on peut réellement apprendre le C, un minimum de théorie et un maximum de pratique.

    @+

    beegees
    Je m'aide du cours sur la page que tu m'as donnée toute a l'heure et en fait, je me suis arrêté a la fin du chapitre sur les tableaux. Et je me casse la tete sur un exercice dans lequel je suis censé additionné les valeurs d'un tableau! Donc, je n'ai pas encore abordé le chapitre sur les structures!

    Je vais d'abord essayé de résoudre cet exo!!


    Merci

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par neo214 Voir le message
    j'ai du mal a me rendre compte reellement de l'utilité des pointeurs, pourtant, je sais que c'est LE point fondamental du langage en C.
    http://emmanuel-delahaye.developpez....util_pointeurs

    Ecrire une fonction inc() telle que

    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
     
     
    void inc (/* a completer */)
    {
       /* a completer */
    }
     
    int main (void)
    {
       int i = 3;
     
       inc (/* a completer */);
     
       /* i == 4 */
     
       return 0;
    }

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    http://emmanuel-delahaye.developpez....util_pointeurs

    Ecrire une fonction inc() telle que

    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
     
     
    void inc (/* a completer */)
    {
       /* a completer */
    }
     
    int main (void)
    {
       int i = 3;
     
       inc (/* a completer */);
     
       /* i == 4 */
     
       return 0;
    }


    Merci a toi pour le lien et le petit exo.

    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
    19
     
     
    void inc(long *pointeur)
    {
     
       (*pointeur)++;  
     
    }
     
     
    int main()
    {
     long i=3;
     long *pointeur=&i;
     inc(pointeur);
     printf("%d\n", *pointeur);
     
        return 0;
    }


    Alors voila en gros ce que j'ai fait:
    1/ J'ai créé un pointeur et je lui ais associé l'adresse de la variable i.
    2/ Je fais appel a la fonction inc et je lui transmet en parametre le pointeur contenant donc l'adresse de i.
    3/Dans la fonction int, on incrémente de 1 la valeur de i
    4/Et enfin, de retour dans la fonction main, on affiche la valeur de i grace a un printf! Cette valeur est donc egale a 4!


    Voila, j'espere avoir résonné correctemment!

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut
    Je voulais dire "RAISONNE"

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par neo214 Voir le message
    Je voulais dire "RAISONNE"
    La touche est faite pour ça...

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par neo214 Voir le message
    Alors voila en gros ce que j'ai fait:
    1/ J'ai créé un pointeur et je lui ais associé l'adresse de la variable i.
    2/ Je fais appel a la fonction inc et je lui transmet en parametre le pointeur contenant donc l'adresse de i.
    3/Dans la fonction int, on incrémente de 1 la valeur de i
    4/Et enfin, de retour dans la fonction main, on affiche la valeur de i grace a un printf! Cette valeur est donc egale a 4!
    Le raisonnement est correct, mais inutilement complexe : on est pas obligé de passer par un pointeur intermédiaire. De plus, la fonction de s'appelle pas int, mais inc()...

    Le code est incomplet et incorrect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:11: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:15: warning: implicit declaration of function `printf'
    main.c:15: warning: int format, long int arg (arg 2)
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 2 seconds)
    0 errors, 3 warnings
    Il est plus significatif d'afficher i avant et après...

    Correction :
    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
     
    #include <stdio.h>
     
    void inc (long *pointeur)
    {
       (*pointeur)++;
    }
     
    int main (void)
    {
       long i = 3;
     
       printf ("%ld\n", i);
       inc (&i);
       printf ("%ld\n", i);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    3
    4
     
    Press ENTER to continue.
    Pose des questions si tu ne comprends pas.

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 8
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Le raisonnement est correct, mais inutilement complexe : on est pas obligé de passer par un pointeur intermédiaire. De plus, la fonction de s'appelle pas int, mais inc()...

    Le code est incomplet et incorrect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:11: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:15: warning: implicit declaration of function `printf'
    main.c:15: warning: int format, long int arg (arg 2)
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 2 seconds)
    0 errors, 3 warnings
    Il est plus significatif d'afficher i avant et après...

    Correction :
    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
     
    #include <stdio.h>
     
    void inc (long *pointeur)
    {
       (*pointeur)++;
    }
     
    int main (void)
    {
       long i = 3;
     
       printf ("%ld\n", i);
       inc (&i);
       printf ("%ld\n", i);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    3
    4
     
    Press ENTER to continue.
    Pose des questions si tu ne comprends pas.




    D'accord, je comprend bien ce que tu as fait: Au lieu de créer un pointeur dans la fonction principale, tu as donc envoyé directement l'adresse de la variable i a la fonction inc (grace a &i)!!!
    C'est vrai que ca permet de raccourcir le code!

    Par contre, il y a une question que je me pose: La fonction void est par définition une fonction qui ne renvoie rien. Je veux dire par la, que ca ne sert a rien d'utiliser un return avec la fonction void!

    Alors ma question serait:
    Si nous utilisons des pointeurs (nous n'utilisons donc pas de return), pouvons nous travailler seulement qu'avec des fonctions void?

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par neo214 Voir le message
    Par contre, il y a une question que je me pose: La fonction void est par définition une fonction qui ne renvoie rien. Je veux dire par la, que ca ne sert a rien d'utiliser un return avec la fonction void!

    Alors ma question serait:
    Si nous utilisons des pointeurs (nous n'utilisons donc pas de return), pouvons nous travailler seulement qu'avec des fonctions void?
    En théorie, oui. Dans la pratique, une fonction 'industrielle' retourne généralement un compte-rendu de fonctionnement (code d'erreur) selon une convention bien connue :
    • 0 = OK
    • <> 0 = erreur.

    Innombrables exemples : http://emmanuel-delahaye.developpez.com/clib.htm

    De plus, la fonction qui créée l'objet ('constructeur' dans d'autres langages...) retourne généralement l'adresse de l'objet créé (ce que fait fopen() et surtout malloc(), on a rien inventé !).

    http://emmanuel-delahaye.developpez.com/tad.htm

Discussions similaires

  1. Exercices pour débutant
    Par Pulsar360 dans le forum AWT/Swing
    Réponses: 0
    Dernier message: 04/04/2013, 11h53
  2. 11 exercices (pour débutants)
    Par Invité dans le forum Contribuez
    Réponses: 2
    Dernier message: 24/06/2012, 08h12
  3. exercices pour débutants
    Par didier49122 dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2012, 14h37
  4. Exercice pour débutant : afficher nombres de 0 à 9
    Par gadour14 dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 19/02/2009, 21h07

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