Pointeur en langage C
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 39

Pointeur en langage C



  1. #1
    deyni

    Pointeur en langage C


    ------

    Bonsoir.

    Je le dis honnêtement, c'est bientôt mon examen de C. J'ai tout révisé, sauf ça. Je ne comprend pas grand chose aux pointeurs. J'ai lu les liens sur wikipedia, mais je ne comprends toujours pas.
    Tout, mais vraiment tout:
    si je fais:

    1)int *a
    2)&b
    3)*a=*b
    4)*a=b
    5)&a=b
    6)&b=&a
    7)&b=*a
    8)&b=&a
    9)int &b
    10)Comment échanger les contenues de la mémoire

    Ce sont mes 10 grosses incompréhension.
    Dans ce que j'ai écrit, toutes les questions sont indépendantes.

    Quelqu'un peut me dire à quoi correspondent ces instructions s'il vous plait?

    Merc beaucoupi;

    -----

  2. #2
    bzh_nicolas

    Re : Pointeur en langage C

    C'est dommage de ne pas avoir révisé ça, c'est un peu la base en C...

    Sinon, concernant tes questions, si tu pouvais expliciter un peu, ça serait pas mal...

  3. #3
    deyni

    Re : Pointeur en langage C

    C'est le plus difficile.

    Ce que je voulais dire, c'est si je fais la commande 1), je fais quoi:je crée un pointeur?j'initialise?je cherhce une adresse?

    Désolé pour l'incompréhension.

    Merci.

  4. #4
    bzh_nicolas

    Re : Pointeur en langage C

    Citation Envoyé par deyni Voir le message
    1)int *a
    2)&b
    3)*a=*b
    4)*a=b
    5)&a=b
    6)&b=&a
    7)&b=*a
    8)&b=&a
    9)int &b
    10)Comment échanger les contenues de la mémoire
    ok
    1) tu déclares un pointeur sur un int
    2) l'adresse de la variable b
    3) tu remplaces la valeur de a par celle de b, les 2 étant des pointeurs
    4) tu remplaces la valeur de a par celle de b, a est un pointeur, b n'en est pas un
    5) n'existe pas
    6) n'existe pas
    7) n'existe pas
    8) n'existe pas
    9) n'existe pas
    10) comme dans tous les cas d'algorithmique, en passant par une 3ème variable.

  5. A voir en vidéo sur Futura
  6. #5
    deyni

    Re : Pointeur en langage C

    Merci beaucoup de vous êtes penché sur mon cas

    Néanmoins, je ne comprends pas le 3) et le 4); surtout le 3).
    *a=*b
    "tu remplaces la valeur de a par celle de b, les 2 étant des pointeurs"

    Comment pouvons-nous échanger les valeurs puisque ce sont des pointeurs.
    C'est ce que mon prof à dit, mais je ne comprends pas.

    Les pointeurs, ce sont des trucs comme des flèches, elles existent fictivement.

    Je ne comprends pas, pouvez-vous m'expliquer s'il vous plait?

    Merci.

  7. #6
    bzh_nicolas

    Re : Pointeur en langage C

    Non les pointeurs ne sont pas fictifs, ce sont des variables qui contiennent une adresse mémoire. Comme une flèche qui pointe vers une case mémoire contenant une valeur.
    quand tu écris :
    *a=*b;
    *a désigne la valeur de la case pointé par le pointeur qui s'appelle a.

  8. #7
    deyni

    Re : Pointeur en langage C

    Citation Envoyé par bzh_nicolas Voir le message
    Non les pointeurs ne sont pas fictifs, ce sont des variables qui contiennent une adresse mémoire. Comme une flèche qui pointe vers une case mémoire contenant une valeur.
    quand tu écris :
    *a=*b;
    *a désigne la valeur de la case pointé par le pointeur qui s'appelle a.
    Mais c'est une flèche, comment peut-elle avoir une valeur?

    Merci.

  9. #8
    Jack
    Modérateur

    Re : Pointeur en langage C

    Mais c'est une flèche, comment peut-elle avoir une valeur?
    C'est une image. Le pointeur permet d'accéder à une donnée de manière indirecte:

    Je vais faire une analogie avec la recherche d'une personne:
    - la méthode classique: Jean habite au 5, rue de l'Eglise
    - avec les pointeur, donc de manière indirecte: l'adresse de Jean se trouve sur la 4ème page de mon carnet d'adresse (et à la 4ème page se trouve bien sur écrit 5, rue de l'Eglise) Le pointeur, donc la fameuse flèche pointe sur la 4ème ligne du carnet.

    Je sais ça peut paraitre tordu, mais tu ne sais pas le nombre de choses qu'on ne pourrait pas faire sans ce mécanisme.
    Un exemple: si Jean change d'adresse: tu gommes 5, rue de l'glise et tu le remplaces par 43 rue Principale. Bien que jean ait changé d'adresse, on sait que celle-ci se trouve toujours à la 4ème page du carnet, donc de ce point de vue rien n'a changé.

    A+
    Dernière modification par Jack ; 09/01/2011 à 11h53.

  10. #9
    invite849f6457

    Re : Pointeur en langage C


  11. #10
    Jackyzgood

    Re : Pointeur en langage C

    Je vais donner une petite astuce qui m'a permis de comprendre un peu mieux, tous ces trucs.

    Je me suis dis :

    Une variable c'est comme une boite aux lettres, elles ont toutes les 2 une adresse et un contenu.

    Un pointeur, c'est un avis de passage du facteur, il va permettre de récupérer le colis à une autre adresse.

    Maintenant pour revenir un peu dans le sujet, il faut bien faire attention à certaines choses notamment que :

    int *a;
    et
    *a;

    Sont totalement différent !!

    Dans le premier cas on déclare le pointeur et donc "*" n'est là que pour indiquer au compilateur qu'il s'agit d'un pointeur, alors que dans le deuxième cas on regarde le contenu de l'adresse sur laquelle il pointe.

    C'est de mon point de vue la seule ambiguïté qui existe.

    Sinon je te conseille de lire le tuto sur le site du zéro, qui est très complet avec un chapitre entier sur les pointeurs.
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

  12. #11
    whoami

    Re : Pointeur en langage C

    Bonjour,
    Citation Envoyé par Jackyzgood Voir le message
    C'est de mon point de vue la seule ambiguïté qui existe.
    Il n'y a pas d'ambiguïté, la syntaxe n'est pas la même.

  13. #12
    deyni

    Re : Pointeur en langage C

    OK.

    Merci beucoup je comprends mieux. Donc je me suis attaqué, à un exo, utilisant les pointeurs:
    1)On a le mot bonjour, grace aux pointeurs, afficher roujnonb(l'opposé du mot)
    2)on a la prase suivante: Le C c est super(pas ' après c). Grace aux pointeurs faire afficher:
    LeCcestsuper
    Vous pourrez utiliser toutes vos connaisances acquises, notamment les tableaux.

    Voilà, mais j'y arrive pas , si quelq'un pouvait m'aider.

    Merci.

  14. #13
    Jackyzgood

    Re : Pointeur en langage C

    Citation Envoyé par whoami Voir le message
    Bonjour,

    Il n'y a pas d'ambiguïté, la syntaxe n'est pas la même.
    Oui, mais je n'ai pas trouvé d'autres mots pour l'exprimer. Ce que je voulais faire comprendre c'est que "*" ne signifie pas la même chose dans les 2 cas, ce qui peut être déroutant.

    @deyni :

    Pour ton exercice il faut savoir qu'un tableau n'est rien d'autre qu'un pointeur sur le premier élément. En claire :

    &(tableau[0]) = tableau;

    On peut donc accéder à un caractère du tableau de 2 manière différente.
    tableau[0] = *tableau;
    tableau[1] = *(tableau + 1);
    ..
    tableau[n-1] = *(tableau + n-1);
    avec n étant le nombre d'élément du tableau.
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

  15. #14
    deyni

    Re : Pointeur en langage C

    OKK

    for(i=0; i<=N-1; i++){
    tableau[i]=tableau[N-i-1]
    }

    Mais pour supprimer les espaces?

    Merci.

  16. #15
    Jackyzgood

    Re : Pointeur en langage C

    Pour supprimer les espaces il faut faire un test du genre :

    Code:
    if(tableau[i] == ' ')
    {
    
    }
    
    ou
    
    if(tableau[i] != ' ')
    {
    
    }
    Dernière modification par JPL ; 10/01/2011 à 15h39.
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

  17. #16
    deyni

    Re : Pointeur en langage C

    Jazygood

    Je ne comprends pas votre méthode
    S'il voit un espace, il doit faire quoi pour le supprimer?

    Merci.

  18. #17
    Jackyzgood

    Re : Pointeur en langage C

    rôôô, je ne vais pas faire l'exercice à votre place, il faut quand même se creuser un minimum les méninges.

    En gros il faut se poser la question : si on rencontre un espace dans la chaine de caractères faut-il le copier ou non ?
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

  19. #18
    deyni

    Re : Pointeur en langage C

    Non, il ne faut pas le copier.
    Ma question est comment le supprimer.
    Dés qu'on rencontre un espace on le supprime.
    Comment?
    On décale la lettre d'un rang vers la gauche?
    Ce qui est très très compliqué!!

  20. #19
    Jackyzgood

    Re : Pointeur en langage C

    De toute façon dans ce genre de cas il faut toujours une variable tampon, une variable qui ne va servir qu'a stocker momentanément une information.

    Vous pouvez soit utiliser :
    char caractere_tampon;

    ou alors :
    char *tableau_tampon;

    La 2eme est peut être la mieux adapté. On crée une fonction du genre :

    Code:
    void fonction_retournement(char tableau[], int taille_tableau)
    {
       int i = 0;
       char *tableau_tampon = NULL;
       tableau_tampon = malloc( taille_tableau * sizeof(char));
       
       for(i = 0 ; i < taille_tableau ; i++)
       {
          tableau_tampon[i] = tableau[taille_tableau - i - 1];
       }
    
       for(i = 0 ; i < taille_tableau ; i++)
       {
          tableau[i] = tableau_tampon[i];
       }
       
       free(tableau_tampon);
    }
    Voila une fonction qui lorsqu'on lui envoie un tableau de caractères ainsi que sa taille, va le retourner via une variable tampon, qui se trouve être un tableau. On peut faire la même chose avec une simple variable, mais personnellement je préfère bien faire ressortir les différentes étapes du programme (surtout si c'est pour comprendre quelque chose), la on voit bien les 2 temps :

    1)copie du tableau dans la variable tampon, à l'envers
    2)copie du tableau tampon dans le tableau.

    Donc pour enlever les espace il suffira simplement de ne pas les recopier dans le tableau tampon.
    Dernière modification par JPL ; 10/01/2011 à 15h39. Motif: Ajout de la balise Code pour la lisibilité
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

  21. #20
    deyni

    Re : Pointeur en langage C

    Merci beaucoup.

    J'ignore si vous êtes professeur, mais je trouve votre méthode très pédagogique. J'ai bien compris, et même plus, je serai capable de le refaire.

    Donc, pour supprimer les espaces, avant votre 2eme boucle on écrit:
    if(tableau[i]!=' '){
    for(i = 0 ; i < taille_tableau ; i++)
    {
    tableau[i] = tableau_tampon[i];
    }


    C'est ça?
    Merci beaucoup.
    Vous m'avez déjà bien aidé.

    Ps:merci aussi pour votre balise pour le code.

  22. #21
    Jackyzgood

    Re : Pointeur en langage C

    Non je ne suis pas prof, mais j'ai appris tous seul à programmer, alors j'ai du me trouver des méthodes et des petites astuces pour que les choses soient bien claires.

    Pour ton code :

    Code:
    if(tableau[i]!=' ')
    {
       for(i = 0 ; i < taille_tableau ; i++)
       {
          tableau[i] = tableau_tampon[i];
       }
    }
    J'ai 2 choses à dire
    1)Toujours bien indenter le code !! C'est très très important, autant pour toi que pour celui qui le lira.
    2)Ca ne donnera rien de bon ...

    La chose à laquelle je pense toujours quand je code c'est : Un ordinateur c'est aussi intelligent qu'un grille pain ! On appui sur un bouton et il fait quelque chose. A l'extrême si on lui demande de planter ... bah il plante ...

    Je vais mettre des commentaires pour que tu vois est l'erreur :

    Code:
    if(tableau[i]!=' ')   //quelle est la valeur de i à ce moment là ?
    {
       for(i = 0 ; i < taille_tableau ; i++)  //cette boucle sera-t-elle exécute ?
       {
          tableau[i] = tableau_tampon[i];
       }
    }
    Pour bien coder il faut savoir DANS L'ORDRE ce que l'on veut faire, dans ton cas tu veux :
    1)Parcourir tous les caractères du tableau
    2)les recopier, sauf si ce sont des espaces.

    Ton code fait la seconde partie du 2 avant le reste, donc la valeur de i sera celle définie au départ et donc elle sera fixe puisque la boucle ne se lancera pas.
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

  23. #22
    doul11

    Re : Pointeur en langage C

    salut,

    on peut faire ça sans variable tampon
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  24. #23
    deyni

    Re : Pointeur en langage C

    Je crois avoir compris:
    Code:
     for(i = 0 ; i < taille_tableau ; i++){
                        if(tableau[i]==' '){
                             tableau[i]=tableau[i+1]
                          }
                      else{
          tableau[i] = tableau_tampon[i];
       }
    Comme ça je crois.

  25. #24
    Jackyzgood

    Re : Pointeur en langage C

    Non ça ne donnera pas grand chose...
    Tu va avoir des lettres en double si je ne me trompe pas, je te laisse un peu chercher pourquoi.
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

  26. #25
    Jack
    Modérateur

    Re : Pointeur en langage C

    pour mettre sur la bonne piste, il faut 2 indices de parcours du tableau:
    un pour la lecture
    un pour l'écriture.

    A+

  27. #26
    deyni

    Re : Pointeur en langage C

    Code:
     for(i = 0 ; i < taille_tableau ; i++){
                        if(tableau[i]==' '){//s'il voit un espace
                             tableau[i]=tableau[i+1];//saute la case
                          }
                      else{//s'il n'y a pas d'espace
                              for(i=0; i<=taille_tableau; i++){
                                     tableau[i] = tableau_tampon[i];//il recopie le tableau.
       }
    }
    Là, je pense que c'est OK.

    Merci.

  28. #27
    doul11

    Re : Pointeur en langage C

    salut,

    non c'est pas bon, tu n'a pas fait ce que Jack a écrit, pour t'aider un peut plus tu doit copier le caractère dans le tampon quand ce n'est pas un espace.
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  29. #28
    Jackyzgood

    Re : Pointeur en langage C

    Alors d'après moi, ce qui va se passer :

    Au premier caractère qui ne sera pas un espace, les instructions dans le "else" vont être exécutés, or dans celle ci il n'y a aucune condition si jamais un des caractère est un espace ... Donc ces instructions vont bêtement recopier le tableau. De plus cette 2eme boucle for va modifier la valeur de i qui est utilisé dans la première boucle et donc gêner son fonctionnement (puisque les 2 sont imbriqués), je dirais même qu'elle ira jusqu'à court-circuiter cette première boucle. Sans parler du fait que "i <= taille_tableau" risque de générer une erreur de segmentation.... Puisqu'à la fin tu vas chercher dans une case mémoire qui ne fait pas parti du tableau.

    En fait ce que Jack voulait dire avec :
    pour mettre sur la bonne piste, il faut 2 indices de parcours du tableau:
    un pour la lecture
    un pour l'écriture.
    C'est qu'il te faut 2 variables, une pour "tableau" et une autre pour "tableau_tampon"

    Code:
    int i = 0, j = 0;
    //i sera utilisé pour "tableau" et j pour "tableau_tampon"
    //comme on doit parcourir entièrement "tableau" on fera la boucle for avec i
    
    for(i = 0 ; i < taille_tableau ; i++)
    {
       while(tableau[i] == ' ' && i < taille_tableau)
       {
          i++;
       }
    
       tableau_tampon[j] = tableau[i];
       j++;
    }
    Tu peux voir dans ce code que i et j sont incrémentés à chaque fois, puis il y a cette boucle while, si tu ne sais pas comment ça marche c'est simplement une boucle qui tournera tant que la ou les conditions sont respecté. Dans mon cas : tant que le caractère est un espace et tant que i est inférieur à la taille du tableau. Grâce à ça on peut gérer plusieurs espaces à la suite (on ne sait jamais). Une fois que i à une valeur correcte (qui ne va pas mener à un espace) on copie dans le tableau tampon.

    Sinon on peut faire autrement, vu qu'on ne cherche pas à tout copier et qu'on va perdre des informations on peut faire ça sans variable tampon.
    Code:
    for(i = 0 ; i < taille_tableau ; i++)
    {
       while(tableau[i] == ' ' && i < taille_tableau)
       {
          i++;
       }
    
       tableau[j] = tableau[i];
       j++;
    }
    Ce code devrait également fonctionner.
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

  30. #29
    doul11

    Re : Pointeur en langage C

    Citation Envoyé par Jackyzgood Voir le message
    Sinon on peut faire autrement, vu qu'on ne cherche pas à tout copier et qu'on va perdre des informations on peut faire ça sans variable tampon.
    Code:
    for(i = 0 ; i < taille_tableau ; i++)
    {
       while(tableau[i] == ' ' && i < taille_tableau)
       {
          i++;
       }
    
       tableau[j] = tableau[i];
       j++;
    }

    une autre façon de faire :


    Code:
    j=0;
    for(i=0;i<strlen(s);i++)
    	{
    	s[j]=s[i];
    	if(s[j]!=' '){j++;}
    	}
    	
    s[j]=0;
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  31. #30
    Jackyzgood

    Re : Pointeur en langage C

    Sans vouloir être méchant, mais la fonction que tu propose copie le premier caractère sans distinction, donc si c'est un espace il sera copié et de plus elle ne gère pas le cas ou il y aurait plusieurs espaces à la suite.
    si c'est idiot mais que ca marche, c'est que ce n'est pas idiot

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Pointeur laser
    Par invite376b1ad0 dans le forum Physique
    Réponses: 4
    Dernier message: 04/05/2017, 13h49
  2. pointeur
    Par invitef6dc9c06 dans le forum Électronique
    Réponses: 3
    Dernier message: 15/01/2008, 20h53
  3. Problème Langage C Structure, Pointeur, ...
    Par invite3e43df7f dans le forum Logiciel - Software - Open Source
    Réponses: 17
    Dernier message: 01/04/2006, 20h14
  4. Langage C : pointeur sur une fonction en argument ...
    Par invite1a99f682 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 27/07/2005, 10h29