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 :

Question : L'adresse du pointeur sur un tableau


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 8
    Points
    8
    Par défaut Question : L'adresse du pointeur sur un tableau
    Bonjour,

    J'arrive pas à élucider d'une manière claire un problème assez embarrassant, Lors de l'utilisation d'un tableau à unique indice: int tab[10] par exemple. tab[0] désigne la valeur de la première case, et tab est le pointeur sur la case qui comporte cette valeur. L’ambiguïté chez moi , se présente lorsque je veux disposer de l'adresse de tab, autrement dit l'adresse du pointeur qui pointe vers la première case du tableau . Le fait d'écrit &tab n'arrange pas le problème puisqu'il renvoie l'adresse de la case ( &tab[0] ) et pas concrètement l'adresse du pointeur.

  2. #2
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Bonjour,

    Si j'ai bien compris ton problème ceci peut t'aider et le résoudre

    Pointeurs et tableaux :

    L'utilisation du pointeur de l'exemple précédent n'a qu'un intérêt pédagogique. Mais en C/C++, il y a des cas ou on ne peut pas se passer de leur utilisation. Prenons le cas des tableaux : Le nom d'un tableau sans décoration retourne l'adresse du premier élément du tableau. Ceci fait que l'on peut l'utiliser de la même manière qu'un pointeur tout en gardant à l'esprit que ce n'est pas un pointeur pour autant.
    Soit le tableau Tab suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Tab[10]={5,8,4,3,9,6,5,4,3,8};
    L'instruction suivante affiche bien la valeur du premier élément du tableau par pointeur déréférencé.

    Ceci nous montre que le nom d'un tableau peut trés bien s'utiliser comme un pointeur sur son premier élément. On peut alors tout à fait déclarer un pointeur et l'initialiser avec le nom du tableau. A condition bien sûr qu'il soit du même type, pointeur sur des entiers dans notre cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     int *pTab;
          pTab = Tab;
    On peut donc se servir de ce pointeur comme s'il était un tableau et des opérateurs crochets [] pour accéder à ses éléments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d",pTab[0]);    // Affiche 5.
    Mais ce n'est pas un autre tableau c'est le même que Tab, il référence le même emplacement en mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          pTab[0]++;
          printf("%d",Tab[0]);    // Affiche 6.
    Quand j'incrémente le premier élément du tableau en utilisant le pointeur c'est bien le premier élément du tableau d'origine qui est incrémenté.

    Que ce passe t'il si j'écris :

    J'ai l'affichage d'une valeur ne faisant pas partie de mon tableau. Ceci est dû au fait que je vais lire une valeur en dehors des limites du tableau sans que le système signale une erreur. L'opérateur crochet n'étant qu'une écriture simplifiée du pointeur déréférencé, ceci :

    est équivalent à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     printf("%d",*(Tab+10));
    Un pointeur et donc un tableau peuvent facilement accéder à n'importe quel lieu en mémoire sans la moindre alerte, jusqu'au plantage de l'application.
    Cette dernière écriture ne vous est peut-être pas familière pour accéder au contenu d'un tableau. Elle nous amènera donc à parler de l'arithmétique des pointeurs.

    Source : http://chgi.developpez.com/pointeur/
    ---
    Overcrash

    Je ne lis pas les codes qui ne sont pas indentés.
    Merci de les messages utiles en cliquant en bas à droite du message

    Bloqué par le firewall pour accéder au chat ? Essayez avec l'adresse en direct : http://87.98.168.209/

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    L’ambiguïté chez moi , se présente lorsque je veux disposer de l'adresse de tab, autrement dit l'adresse du pointeur qui pointe vers la première case du tableau .
    tab n'est pas un pointeur mais un tableau. il n'y a pas de pointeur qui pointe sur la première case du tableau. tab référence directement la première case du tableau comme n'importe quelle autre variable le ferai.

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Pour compléter ce que dit Lucien63 :

    tab représente le tableau lorsqu'il est l'opérande des opérateurs sizeof et & (adresse de). Dans tous les autres cas, il représente l'adresse du premier élément du tableau.
    C'est donc dans ce cas une valeur de type adresse et non pas un objet pointeur (objet qui stocke des valeurs de type adresse).

    Plutôt de parler d'adresse ou de constante adresse, certains préfèrerons dire qu'il s'agit d'une constante pointeur (comme 1 est une constante int et n'est pas un objet et donc on ne peut écrire &1). Il n'y a pas d'ambiguité, mais si on simplifie ce discours en disant, pour faire court, qu'il s'agit d'un pointeur au lieu d'une constante pointeur , on provoque la confusion entre "adresse" et "objet pointeur".

    Personnellement, j'utilise le terme "adresse" pour ces valeurs et réserve le terme "pointeur" aux objets chargés de stocker des adresses.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 5
    Points : 8
    Points
    8
    Par défaut
    Ok, maintenant j'arrive à comprendre ! Merci bcq diogene, également Lucien63 et Overcrash3181 . Justement le fait de lire "pointeur constant" m'a désorienté.
    Encore merci.

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

Discussions similaires

  1. Paramètre : pointeur sur un tableau
    Par _Michel dans le forum Débuter
    Réponses: 2
    Dernier message: 15/02/2009, 16h08
  2. Réponses: 5
    Dernier message: 21/09/2008, 09h45
  3. Réponses: 8
    Dernier message: 17/09/2008, 12h11
  4. Réponses: 1
    Dernier message: 09/07/2006, 23h39
  5. Références et pointeurs sur un tableau
    Par smag dans le forum C++
    Réponses: 2
    Dernier message: 01/03/2005, 20h29

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