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 :

Confusion affectation tableaux et structures en langage C


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 48
    Points : 47
    Points
    47
    Par défaut Confusion affectation tableaux et structures en langage C
    Bonjour à tous,

    Je post cette discussion pour m’éclaircir sur un sujet qui me tracasse depuis longtemps.

    Je ne comprend pas pourquoi en langage C, on ne peut pas faire une affectation directe de deux tableaux, alors que contrairement avec les structures on peut, Sachant que les structures en C sont des sorte de tableau avec des éléments de différents type.

    Je m'explique :

    Prenons les déclarations suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int a [10];
    int b [10];
    typedef struct c;
    typdef struct d;
     
    c str_c
    d str_d;
    Je cherche à comprendre pourquoi on ne peut pas ecrire , alors que l'on peut écrire .

    Merci d'avance pour vos réponses.

    Cordialement,

  2. #2
    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
    La raison est que si l'expression A désigne un tableau d'éléments de type T, alors l'évaluation de A donnera l'adresse du premier élément du tableau (donc sera du type T* et non pas T[]) sauf dans les deux cas suivants :

    1- A est opérande de l'opérateur unaire & (adresse de)

    2- A est opérande de l'opérateur unaire sizeof

    Dans tous les autres cas, la valeur de A sera donc l'adresse du premier élément du tableau et n'est pas un objet (ni pointeur ni tableau)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je ne comprend pas pourquoi en langage C, on ne peut pas faire une affectation directe de deux tableaux, alors que contrairement avec les structures on peut, Sachant que les structures en C sont des sorte de tableau avec des éléments de différents type
    Tout simplement parce que cette vision, bien que tentante, est totalement fausse !

    En effet, si tu déclares :
    , il est en fait très rare que l'utilisation de la variable tab soit un tableau. C'est en général un pointeur vers le premier élément du tableau (bien que tab soit vraiment un tableau, c'est bien la valeur évaluée qui est celle d'un pointeur !)

    En revanche, dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct monType maStruct;
    , maStruct est toujours une structure.

    De plus, un tableau est une simple succession en mémoire et de manière contiguë de plusieurs éléments du même type et te donne simplement un moyen commode d'y accéder. En revanche, les éléments d'une structure se suivent mais ne sont pas collés (il y a potentiellement des trous, remplis avec des bits de padding).

    Bref, la philosophie des 2 entités est très différentes, leur nature réelle aussi et donc leurs utilisations différent fatalement

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Le plus déroutant, c'est qu'une structure contenant un tableau peut être affectée, et le tableau avec.

    À noter que "tableau de 10 int" reste un type: Si on demande l'adresse d'un tableau (&tab), le résultat sera de type "pointeur sur tableau de 10 int" (noté int (*)[10] au lieu de int[10]*)

    Le pointeur sur tableau de 10 int se déclare ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tab[10];
    int (*ptr)[10];
    ptr = &tab;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Les tableaux de dim. 7 (langage C)
    Par gazere dans le forum Windows
    Réponses: 4
    Dernier message: 06/04/2008, 18h09
  2. pointeur sur Tableaux de structures
    Par Linu6 dans le forum C
    Réponses: 10
    Dernier message: 31/12/2007, 14h29
  3. tableaux de structures, aidez-moi
    Par tannana dans le forum C
    Réponses: 2
    Dernier message: 22/02/2007, 19h02
  4. [Linux]problème d'affectation d'une structure
    Par cimcim dans le forum Linux
    Réponses: 5
    Dernier message: 11/12/2006, 17h13
  5. Structure du langage et fonctions
    Par $@&_# dans le forum Langage
    Réponses: 1
    Dernier message: 26/11/2006, 20h11

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