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 et pointeurs de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Par défaut Pointeurs et pointeurs de pointeurs
    Bonjour,

    Voici mon 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #include <string.h>
    #define max 10
     
     
    int main (){
    	/* adresse d'un pointeur */
    	int variable;
    	int *ptr;
    	int **ptrDePtr;
    	ptr = &variable;
    	ptrDePtr = &ptr;
    	variable = 17;
    	printf("Adresse de la variable pointee : %p\n", &variable);
    	printf("Adresse du pointeur : %p\n", ptr);
    	printf("Adresse du pointeur de pointeur avec un asterisque : %p\n", *ptrDePtr);
    	printf("Adresse du pointeur de pointeur sans asterisque : %p\n", ptrDePtr);
    	return (0);
    }
    Et voici le résultat à l'exécution :


    Adresse de la variable pointee : 0x7fff8b6024bc
    Adresse du pointeur : 0x7fff8b6024bc
    Adresse du pointeur de pointeur avec un asterisque : 0x7fff8b6024bc
    Adresse du pointeur de pointeur sans asterisque : 0x7fff8b6024c0
    [Finished in 0.0s]

    Question :

    Pourquoi est-ce que l'adresse du pointeur de pointeur sans astérisque dans le printf est différente de l'adresse 0x7fff8b6024bc initialement obtenue à trois reprises ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    Justement parce que ce n'est pas la même variable. Quand tu utilises « * », tu déréférences le pointeur, c'est-à-dire que tu indiques au compilateur que tu ne t'intéresses plus au pointeur lui-même mais à ce qu'il pointe.

    Par conséquent, une fois tous tes pointeurs dûment initialisés comme tu l'as fait, l'expression « *ptrDePtr » (avec astérisque) renvoie la même chose que « ptr » (sans astérisque). Si tu omets l'astérisque dans la première expression, tu obtiens le contenu de ptrDePtr, à savoir l'adresse de ptr et plus celle de variable.

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Par défaut
    Merci pour la réponse, et comment pourrais-je obtenir l'adresse de ptr en utilisant ptr lui-même dans mon printf ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    De la même façon qu'un pointeur "normal", en utilisant & devant ta variable.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Exactement de la même façon que tu l'as fait pour « variable » à la première ligne.

    De ce côté, les pointeurs sont des variables ordinaires : elles fonctionnent comme les autres, en précisant bien que le type de leur contenu est une adresse mémoire, et non un entier, un caractère, ou autre…

  6. #6
    Membre très actif
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Par défaut
    Est-ce qu'une adresse mémoire n'est de toute façon un entier ?

  7. #7
    Membre très actif
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Par défaut résumé
    Est-ce que ce code résume bien toute notre théorie ?

    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
    int main (){
    	int variable;
    	int *ptr;
    	int **ptrDePtr;
    	ptr = &variable;
    	ptrDePtr = &ptr;
    	variable = 2;
    	printf("Voici l adresse du pointeur %p\n", &ptr);
    	printf("Voici l adresse du pointeur de pointeur : %p\n", &ptrDePtr);
    	printf("Voici l adresse du pointeur affichee via le pointeur de pointeur : %p\n", ptrDePtr);
    	printf("Voici l adresse de la variable %p\n", &variable);
    	printf("Voici l adresse pointee par le pointeur %p\n", ptr);
    	printf("Voici l adresse pointee par le pointeur de pointeur : %p\n", *ptrDePtr);
    	return 0;
    }

    Résultat du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Voici l adresse du pointeur 0x7fffd8069610
    Voici l adresse du pointeur de pointeur : 0x7fffd8069618
    Voici l adresse du pointeur affichee via le pointeur de pointeur : 0x7fffd8069610
    Voici l adresse de la variable 0x7fffd806960c
    Voici l adresse pointee par le pointeur 0x7fffd806960c
    Voici l adresse pointee par le pointeur de pointeur : 0x7fffd806960c
    [Finished in 0.0s]
    Nous voyons que les deux premiers résultats, à savoir l'adresse du pointeur et l'adresse du pointeur de pointeurs sont différents des trois derniers résultats qui eux sont égaux. En effet, l'adresse de la variable, l'adresse pointée par le pointeur qui pointe vers cette variable et l'adresse pointée in fine par le pointeur de pointeur qui pointe vers l'adresse pointée par le pointeur sont les trois fois la même adresse.

Discussions similaires

  1. pointeur de methode vers pointeur de fonction
    Par yvesall dans le forum GTK+
    Réponses: 1
    Dernier message: 19/11/2008, 17h23
  2. Réponses: 3
    Dernier message: 29/07/2008, 09h56
  3. Réponses: 9
    Dernier message: 07/07/2008, 11h43
  4. pointeur vers tableau de pointeurs
    Par Michel_57 dans le forum C++
    Réponses: 6
    Dernier message: 09/11/2007, 21h41
  5. Réponses: 10
    Dernier message: 03/02/2005, 13h09

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