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 :

Mouvement des adresses des pointeurs


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut Mouvement des adresses des pointeurs
    Bonjour, j'essaie de comprendre le mouvement des adresses des pointeurs.
    J'ai testé avec ce code

    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
    20
    21
    22
    23
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main(int argc, char *argv[])
    {
     
    char *x = malloc(1);
    char *y = malloc(1);
    *x = 20;
    *y = 3;
    printf("x: %p %p %d\n",&x,x,*x );
    printf("y: %p %p %d\n",&y,y,*y );
    // Première partie de l’output
    char*temp=x;x =y;y = temp;
    printf("x: %p %p %d\n",&x,x,*x );
    printf("y: %p %p %d\n",&y,y,*y );
    free(x);
    free(y);
     
     return 0;
    }
    output

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    x : ffbffaa4 20a58 2
    y : ffbffaa0 20a68 3
     
    (devient)
     
    x : ffbffaa4 20a68 3
    y : ffbffaa0 20a58 2
    d'après moi:


    un pointeur pointe sur une adresse mémoire donc
    *x pointe sur &x qui, elle, contient 2.

    Ce qui se passe lors de ce morceau de code :

    char* temp = x ;
    x = y ;
    y = temp ;


    Un pointeur sur une case char est créé, sur lequel on va assigner la valeur de x donc 2. On va écraser x par la valeur de y ( 3 ) et écraser ensuite y en le remplaçant par temp (donc l'ancienne valeur de x : 2 )

    Ce qui se passe dans la mémoire est que l'on a 2 pointeurs. Le premier pointe vers une case qui a une valeur 2 et le second vers une case qui a une valeur de 3.

    Ensuite, on place la valeur x dans temp et le pointeur va pointer sur cette nouvelle case. Idem lorsque l'on écrasera x par 3, le pointeur *y va pointer sur x
    et puis enfin le pointeur de x pointera sur la variable y

    Ce qui explique que seule l'adresse des cases des 2 variables n'ait pas bougé.

    Mais je voudrais vérifier si j'ai juste ou tort.

    Merci

  2. #2
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Salut,

    *x pointe sur &x qui, elle, contient 2.
    Attention à la syntaxe :
    x pointe sur l'adresse &x qui contient la valeur *x (soit 20 au début)
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    ah oui merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Bonjour,

    Citation Envoyé par Linquisiteur Voir le message
    d'après moi:

    un pointeur pointe sur une adresse mémoire donc
    *x pointe sur &x qui, elle, contient 2.
    Non.

    Ce qui se passe lors de ce morceau de code :

    char* temp = x ;
    x = y ;
    y = temp ;


    Un pointeur sur une case char est créé, sur lequel on va assigner la valeur de x donc 2. On va écraser x par la valeur de y ( 3 ) et écraser ensuite y en le remplaçant par temp (donc l'ancienne valeur de x : 2 )
    Non, pas tout-à-fait.

    Citation Envoyé par deletme Voir le message
    x pointe sur l'adresse &x qui contient la valeur *x (soit 20 au début)
    Non plus.

    Il faut bien comprendre que les pointeurs, quand tu les instancies, sont des variables comme les autres. Elles peuvent recevoir n'importe quelle valeur, même si elle est invalide. Il se trouve que cette valeur est réputée être l'adresse en mémoire de quelque chose, mais il n'y a pas de liaison directe entre cette chose et son pointeur.

    Donc, en l'occurrence :
    • x = ffbffaa4, soit 4.290.771.620 en décimal ;
    • y = ffbffaa0, soit 4.290.771.616 en décimal.


    Et c'est tout. Lorsque tu inverses leur contenu avec temp, tu permutes ces valeurs comme tu le ferais avec des entiers ordinaires, par exemple.

    Maintenant, sur le plan syntaxique :
    • x est le nom de ta variable (en l'occurrence un pointeur) ;
    • &x est l'adresse en mémoire de ta variable. Donc ici, de ton pointeur, mais ça pourrait également être l'adresse de n'importe quoi d'autre, comme un entier, encore une fois ;
    • *x se réfère à ce qui est pointé par ton pointeur (donc, contrairement à « & », « * » ne s'applique qu'aux pointeurs). Il se trouve que ce quelque chose est en fait la mémoire que tu as réservé avec malloc et dans laquelle tu as déposé une valeur à l'aide de ce même opérateur.


    Donc, « *x » ne pointe pas sur « &x », parce que ça voudrait dire que le pointeur se pointe lui-même. Et ça ne contient pas « 2 » car, dans ce cas, « 2 » serait l'adresse en mémoire de ton pointeur, ce qui n'a pas de sens sur le système d'exploitation concerné.

  5. #5
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    hummm...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void *ptr;
    int a = 12;
    ptr = &a
    printf("valeur pointée par ptr = %d",*ptr);
    sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur pointée par ptr = 12
    ptr pointe sur l'adresse &ptr (=&a) qui contient la valeur *ptr = 12 non ?
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  6. #6
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Citation Envoyé par deletme Voir le message
    ptr pointe sur l'adresse &ptr (=&a) qui contient la valeur *ptr = 12 non ?
    ptr pointe sur a, c'est a dire qu'il contient l'adresse de a.
    Mais il ne pointe pas sur lui même ! il à sa propre adresse qui est différente de celle de a qui a aussi sa propre adresse.

    Ton code est juste, c'est ton explication qui va pas !
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2011, 10h34
  2. Réponses: 15
    Dernier message: 30/09/2008, 23h36
  3. attribution des vlan à des adresses sous rseaux
    Par meriem_en dans le forum Développement
    Réponses: 1
    Dernier message: 27/06/2006, 15h13
  4. [Mail] Réécriture des adresses des pages.
    Par yanice dans le forum Langage
    Réponses: 5
    Dernier message: 26/05/2006, 10h08
  5. [info] taille des adresses des pointeurs Java
    Par TabrisLeFol dans le forum Général Java
    Réponses: 11
    Dernier message: 14/02/2006, 13h24

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