Les Types Structures Et Les Pointeurs

6
L1 Informatique – Université Paris 8 - 2010-2011 Programmation Impérative I Rim Chaabane [email protected] - Cours 5 - 1 Les types structures et les pointeurs 1. Les types structures Les objets de type structure est comme un tableau, constitué de la réunion d’un ensemble de valeurs. Mais à la différence des tableaux, ces valeurs ne sont pas nécessairement de même type. L’accès à une valeur de la structure ne se fait pas avec l’aide d’indice, mais grâce à son nom. Le type structure permet de rassembler des informations sous une type que vous aurez créé. Par exemple vous créez le type Personne qui possède un nom, un prénom et un âge. Ou bien un type Point qui a une abscisse x et une ordonnée y. 1.1. Déclaration de structure Pour définir un type structure personne, composée de trois champs : nom, prenom et age, il suffit d’écrire les instructions suivantes : /* définition du type struct personne */ struct personne { char nom[20], prenom[15]; int age ; } ; Attention : le point-virgule est nécessaire après l'accolade fermante de la déclaration de la structure. - Personne est le nom du type créé - Nom, prenom et age sont les champs de ce type Nous utilisons ensuite ce type pour déclarer des variables : /*déclaration de variables mere et père de type struct personne */ struct personne mere; struct personne pere; /* définition du type struct point */ struct point { float x, y ; } ; - point est le nom du type créé - x et y sont les champs de ce type /*déclaration de variables A et B de type struct point */ struct point A ; struct point B ;

Transcript of Les Types Structures Et Les Pointeurs

  • L1 Informatique Universit Paris 8 - 2010-2011 Programmation Imprative I Rim Chaabane [email protected] - Cours 5 -

    1

    Les types structures et les pointeurs

    1. Les types structures

    Les objets de type structure est comme un tableau, constitu de la runion dun ensemble de valeurs. Mais la diffrence des tableaux, ces valeurs ne sont pas ncessairement de mme type. Laccs une valeur de la structure ne se fait pas avec laide dindice, mais grce son nom. Le type structure permet de rassembler des informations sous une type que vous aurez cr. Par exemple vous crez le type Personne qui possde un nom, un prnom et un ge. Ou bien un type Point qui a une abscisse x et une ordonne y.

    1.1. Dclaration de structure

    Pour dfinir un type structure personne, compose de trois champs : nom, prenom et age, il suffit dcrire les instructions suivantes :

    /* dfinition du type struct personne */

    struct personne { char nom[20], prenom[15];

    int age ;

    } ;

    Attention : le point-virgule est ncessaire aprs l'accolade fermante de la dclaration de la structure.

    - Personne est le nom du type cr - Nom, prenom et age sont les champs de ce type

    Nous utilisons ensuite ce type pour dclarer des variables :

    /*dclaration de variables mere et pre de type struct personne */

    struct personne mere;

    struct personne pere;

    /* dfinition du type struct point */

    struct point { float x, y ;

    } ;

    - point est le nom du type cr - x et y sont les champs de ce type

    /*dclaration de variables A et B de type struct point */

    struct point A ;

    struct point B ;

  • L1 Informatique Universit Paris 8 - 2010-2011 Programmation Imprative I Rim Chaabane [email protected] - Cours 5 -

    2

    La dfinition dun type structure ne peut tre prcd du mot cl const. Il faut considrer la dfinition dun type struct comme si vous dfinissez un nouveau type en C. Tout type en C ne peut tre constant. Par contre une donne dun type quelconque peut tre dclare comme constante. Ainsi, il est autoris de dclarer des valeurs de type struct comme constantes. Par exemple : const struct point A ;

    Le type des champs dune structure : Les champs dune structure peuvent tre :

    - de nimporte quel type de base - des tableaux dlments de type quelconque - des pointeurs - des structures /!\ une structure peut comporter de champs de son type mais il faut le

    dclarer au pralable de cette faon : typedef struct personne pers ; /* pers est de type struct personne */ struct personne { char nom[20], prenom[15];

    int age ;

    pers * pere ;

    };

    Dclaration de variable de type structure : Il existe trois manires de dclarer des variables de type structure en C :

    Premire mthode

    struct personne{

    char nom[20];

    char prenom[20];

    int no_employe;

    };

    struct personne p1,p2;

    p1=p2 ; /* OK */

    Deuxime mthode

    struct {

    char nom[20];

    char prenom[20];

    int no_employe;

    } p1,p2;

    struct{

    char nom[20];

    char prenom[20];

    int no_employe;

    } p3;

    p3 = p1 ; /* OK */

    Troisime mthode

    struct personne{

    char nom[20];

    char prenom[20];

    int no_employe;

    } p1,p2;

    struct personne p3;

    p3 = p1 ; /* NOK */

    La premire mthode, dfinit un type structure dont le nom est personne. Cette structure

    contient trois champs : un tableau de caractres pour le champ nom, un tableau de caractres

    pour le champ prenom et un entier pour le champ no_employe.

    Plus loin de cette dclaration, nous dclarons deux variables p1 et p2 de type struct

    personne.

    Avec cette mthode, il est possible daffecter p1 la valeur de p2, ces deux variables tant reconnues comme tant du mme type.

  • L1 Informatique Universit Paris 8 - 2010-2011 Programmation Imprative I Rim Chaabane [email protected] - Cours 5 -

    3

    La deuxime mthode dfinit le mme type de structure, sauf que cette fois-ci la structure ne

    porte pas de nom et est immdiatement suivie des noms de variables p1 et p2 de ce type structure. Si plus loin on crit la mme dfinition du type de structure (sans nom) suivi dun nom

    de variable p3, alors il nous sera possible deffectuer des oprations entre p1 ou p2 et p3. La troisime mthode dfinit un type structure avec le nom personne suivi immdiatement des

    noms de variables p1 et p2. Dans cas si lon cre comme la mthode 1, une troisime variable

    p3 de type struct personne, il nous sera impossible deffectuer une quelconque opration

    entre p1 ou p2 et p3. Ce dernier ntant pas reconnu comme tant du mme type que p1 et p2. De ces trois mthodes c'est la premire qui est recommande, car elle permet de bien sparer la dfinition du type structure de ses utilisations.

    1.2. Reprsentation en mmoire

    La norme impose aux objets de type structure les deux contraintes suivantes :

    - les champs doivent tre allous selon leur ordre dapparition dans la structure ; - ladresse dune structure correspond ladresse de son premier champ.

    Ainsi dans les dfinitions suivantes, lordre dapparition des champs est le mme : struct s1 { int n, p ; float x, y ; } ; struct s1 test ;

    struct s2 { int n ;

    int p ; float x ;

    float y; } ;

    @m @m+1 @m+2 @m+3 test

    1.3. Initialisation

    Il existe deux mthodes pour initialiser une variable de type structure :

    Premire mthode : linitialisation se fait juste au moment de la dclaration de la variable de type structure.

    Deuxime mthode : linitialisation se fait aprs la dclaration de la variable de type structure.

    struct personne{

    char nom[20];

    char prenom[20];

    int no_employe;

    };

    struct personne p1 = {"Dupond", "Jean", 7845}; /* mthode 1 */

    struct personne p2 ;

    n p x y

  • L1 Informatique Universit Paris 8 - 2010-2011 Programmation Imprative I Rim Chaabane [email protected] - Cours 5 -

    4

    p2.nom = " Dupond"; p2.prenom = "Jean" ; /* mthode 2 */

    p2.no_employe = 7845 ; Pour accder aux champs de la variable p2, il suffit de faire suivre le nom de la variable dun point suivi du nom du champ.

    Nous dclarons et initialisons maintenant un tableau de 3 lments de type struct personne :

    - Avec la mthode 1 : struct personne tab[3] = { {"Dupond", "Jean", 7845},

    {"Le Notre", "Alfred", 4321},

    {"Le Gall", "Marc", 5678}} ;

    - Ou bien nous linitialisons avec la mthode 2 : struct personne tab[3] ;

    tab[0].nom = "Dupond";

    tab[0].prenom = "Jean";

    tab[0].no_employe = 7845;

    tab[1].nom = "Le Notre";

    tab[1].prenom = "Alfred";

    tab[1].no_employe = 1234;

    tab[2].nom = "Le Gall";

    tab[2].prenom = "Marc";

    tab[2].no_employe = 5678;

    Nous pouvons, alors noter quil est plus simple dinitialiser un tableau de structures avec la premire mthode. La seconde mthode est plutt prconise dans le cas ou les donnes du tableau ne sont pas connues en dbut de programme. Exemple : le programme lit les donnes du tableau de structures partir dun fichier de donnes. Pour initialiser une variable de type structure, il nest pas ncessaire de renseigner tous les champs

    de la structure. Par exemple : struct personne tab[3] = { {"Dupond", "Jean", 7845}, /* Correct */

    {"Le Notre",}, /* Correct */

    /* le troisime lment du

    tableau napparait pas mais

    tant donn que cest le dernier

    son absence ne gne pas la

    compilation */

    };

    Il est galement possible daffecter une valeur de structure une autre, exemple : struct personne p1, p2 = {"Dupond", "Jean", 7845};

    p1=p2 ;

    1.4. Exemple dutilisation

  • L1 Informatique Universit Paris 8 - 2010-2011 Programmation Imprative I Rim Chaabane [email protected] - Cours 5 -

    5

    2. Introduction la notion de pointeur

    Les pointeurs permettent de manipuler directement les adresses mmoire des objets cres ; tels que les variables, les pointeurs ou encore les structures. Soit les dclarations suivantes : int n, t[5] ;

    n est une variable de type int et t est un tableau de 5 lments de type int.

    Pour obtenir ladresse de la variable n ou du tableau t il suffit de faire prcder le nom de

    lobjet par un & : &n ;

    &t ;

    Un pointeur en C contient ladresse mmoire dun objet. Pour dclarer par exemple un pointeur sur ladresse mmoire de la variable n il suffit dcrire :

    int *pn ; /* on dit que pn est le pointeur sur un objet de type int */ ou int * pn ;

    Il peut donc aussi bien contenir ladresse de la variable n (qui est destine contenir un int)

    que ladresse dun lment du tableau t comme par exemple &t[2]: pn = &n ;

    ou

  • L1 Informatique Universit Paris 8 - 2010-2011 Programmation Imprative I Rim Chaabane [email protected] - Cours 5 -

    6

    pn=&t[2] ;

    Nous initialisons donc de cette faon une variable de type pointeur avec des adresses mmoire dobjets de types int. Pour accder au contenu dune adresse mmoire, il faut faire appel au pointeur prcd dune toile comme ci-dessous : *pn = 20 ; /* on place lentier 20 dans ladresse mmoire contenue dans pn */

    Instruction C description Valeur contenue dans @m

    Rsultat

    int n = 3; Rserve une adresse mmoire @m qui contient lentier 3.

    3

    int * pn ; Dclare un pointeur pn sur un entier.

    3

    pn = &n ; Initialise le pointeur pn ladresse de n.

    3 pn = @m

    int l = *pn ; La variable l prend comme valeur le contenu de ladresse

    pointe par pn.

    3 l = 3

    *pn = 9 ; Ladresse pointe par

    pn contient maintenant la valeur 9.

    9 pn = @m

    n = 9

    *(@m)= 9

    printf("%d\n",

    *pn) ;

    Affiche le contenu de @m

    9 9

    Affectation de pointeur :

    p=NULL ; //on cre un pointeur vide qui ne contient aucune adresse

    mmoire

    p = q ; //p et q pointent sur le mme objet

    *p = *q ; //ladresse pointe par p contiendra lobjet point par q

    if (p==q) {} // si p et q pointent sur le mme objet

    if (p !=q) {} //si p et q ne pointent pas sur le mme objet

    p+1 ; //pointe sur lobjet suivant de type t (idem pour p++).

    p-q ; //retourne le nombre dobjets de type point entre les

    adresses pointes par p et q.