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 :

tableau et sizeof()


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Par défaut tableau et sizeof()
    Bonjour,

    Il y a quelque chose que je ne comprend pas au niveau des tableau.

    si on declare :
    vu que tableau est un pointeur c'est comme si on avait:

    ADRESSE===>VALEUR

    tableau ===> @0
    @0 ===> 2
    @1 ===> 6

    mais la fonction sizeof me renvoie deux octets : tableau ===> adresse prend 0 octet?

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    vu que tableau est un pointeur
    Même si le nom du tableau semble ce comporter comme un pointeur,
    ça n'en ai pas un.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    ça n'en ai pas un.
    Dans ce cas là pourquoi printf("%p\n",tableau); affiche une adresse?

  4. #4
    Expert confirmé
    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
    Par défaut
    Il y a deux cas et deux seulement où l'identificateur d'un tableau ne représente pas l'adresse de son premier élément, mais bel et bien le tableau lui-même :
    - Lorsqu'il est l'opérande de l'opérateur sizeof
    - Lorsqu'il est l'opérande de l'opérateur unaire & (adresse de ...)

    Si on a un tableau de N éléments de type T : T tab[N] , sizeof tab renvoie N*sizeof(T)

    Mais si tab est utilisé dans toute autre expression que les deux citées, il est une adresse. Par exemple sizeof (tab+0) renverra la taille d'un pointeur

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Dans ce cas là pourquoi printf("%p\n",tableau); affiche une adresse?
    Car le tableau est situé quelque part en mémoire, et sa valeur correspond à l'adresse du premier élément.

    Un pointeur, c'est une variable (qui a donc un nom, une adresse et une valeur), mais dont sa valeur est une adresse. Et ce pointeur a la caractéristique de pouvoir pointer à cette adresse, grâce à l'opérateur de déréférencement. L'adresse du pointeur n'est pas égale à sa valeur.

    Un tableau est composé d'un certain nombre d'éléments de même type qui se suivent, et l'adresse de ce tableau correspond à l'adresse de son premier élément.

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 58
    Par défaut
    ok c'est plus claire.
    merci pour ces eclaircisements

  7. #7
    Expert confirmé
    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
    Par défaut
    jeroman :
    Car le tableau est situé quelque part en mémoire, et sa valeur correspond à l'adresse du premier élément.
    d'accord
    Un pointeur, c'est une variable ....
    d'accord

    Avec cette définition du pointeur, qui me convient parfaitement, l'identificateur d'un tableau ne représente jamais un pointeur : ce n'est une variable (du type tableau) que dans le contexte des opérateurs sizeof et &. Dans les autres cas, c'est simplement une valeur, l'adresse du premier élément du tableau. Si c'était autrement, on pourrait prendre l'adresse de cette "variable".

  8. #8
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Un tableau n'est jamais un pointeur, se sont deux choses différentes, deux types distincts.

    Certes un tableau se converti en pointeur vers son premier élément, assez souvent même, mais il y a alors création d'un nouvel objet (temporaire).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char tableau[2]={2,6}; // tableau n'est pas un pointeur, son type est char[2], d'où le sizeof
     
    void f(char* tab);
     
    f(tableau); // conversion de l'objet tableau (char[2]) vers l'objet tab (char*)

  10. #10
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    La conversion lorsqu'elle doit avoir lieu est effectuée par le compilateur, c'est-à-dire pendant la compilation. Je ne vois pas de quel objet temporaire tu parles.

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Eh bien l'objet du nouveau type (le pointeur ici). Dès qu'il y a conversion, qu'elle soit implicite ou non, il y a création d'un nouvel objet. Ça ne peut pas être autrement, étant donné que le type d'un objet est invariant durant sa durée de vie.

  12. #12
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    to : Sylvain Togni

    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tableau[2]={2,6};
    char *ptab = tableau;
    Il est créé où l'objet temporaire ?

  13. #13
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Eh bien l'objet du nouveau type (le pointeur ici). Dès qu'il y a conversion, qu'elle soit implicite ou non, il y a création d'un nouvel objet. Ça ne peut pas être autrement, étant donné que le type d'un objet est invariant durant sa durée de vie.
    Dans le processus de conversion, il n'est pas question d'objets : il s'agit de convertir une valeur d'un certain type en une valeur d'un autre type.
    La manière dont le compilateur effectue l'opération ne regarde que lui.

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par diogene Voir le message
    Dans le processus de conversion, il n'est pas question d'objets : il s'agit de convertir une valeur d'un certain type en une valeur d'un autre type.
    La manière dont le compilateur effectue l'opération ne regarde que lui.
    Oui, je parlais d'objet au sens large, plus précisément en l'occurrence il s'agit d'une r-value.

    Mais peu importe, mon propos était surtout de souligner à nouveau qu'un tableau n'est pas un pointeur.

    Citation Envoyé par Lucien63
    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tableau[2]={2,6};
    char *ptab = tableau;
    Il est créé où l'objet temporaire ?
    Une r-value contenant l'adresse du premier élément est crée, puis elle est assignée à la variable ptab.

Discussions similaires

  1. Réponses: 69
    Dernier message: 12/09/2014, 14h47
  2. sizeof() sur un tableau à deux dimensions
    Par Marc22 dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2010, 20h02
  3. Réponses: 2
    Dernier message: 17/09/2009, 14h50
  4. sizeof & tableau de chaine de caratere
    Par la_chevre dans le forum Débuter
    Réponses: 13
    Dernier message: 11/09/2008, 11h18
  5. [Tableau]sizeof et realloc
    Par zsoh dans le forum C
    Réponses: 8
    Dernier message: 02/02/2007, 12h02

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