5
Algorithme et Structures de Algorithme et Structures de Données Données Wurtz Jean-Marie Université Louis Pasteur [email protected] Les pointeurs en C Les pointeurs en C •Opérateurs * et &, priorité •Déclaration : type et fonction (define, struct, union) •Tableaux et pointeurs, initialisation •Passage par adresse : scanf •Retour des fonctions : struct, union, fonction •Allocation dynamique Mémoire d’un ordinateur Mémoire d’un ordinateur 27 Adresse i=27 pi = adresse(i); /* adresse de la cellule mémoire qui contient la valeur 27 */ Les pointeurs en C : Les pointeurs en C : les opérateurs * et & les opérateurs * et & int i, j, *ip; • i=11; ip= &i; • j=21; i j ip 11 21 Ad(i) • *ip=j; i j ip 21 21 Ad(i) Les pointeurs en C : Les pointeurs en C : déclaration de types déclaration de types int i int *pi int **ppi int it[] int *pit[] int *if() int (*ipf)() Priorité : * < [] < () Un entier Pointeur vers un entier Pointeur de pointeur d’entier Tableau d’entier Tableau de pointeurs d’entier Fonction retournant un pointeur d’entier Pointeur de fonction retournant un entier

8-pointeurs-C.pdf

Embed Size (px)

Citation preview

Page 1: 8-pointeurs-C.pdf

1

Algorithme et Structures de Algorithme et Structures de DonnéesDonnées

Wurtz Jean-Marie

Université Louis [email protected]

Les pointeurs en CLes pointeurs en C•Opérateurs * et &, priorité

•Déclaration : type et fonction (define, struct, union)

•Tableaux et pointeurs, initialisation

•Passage par adresse : scanf

•Retour des fonctions : struct, union, fonction

•Allocation dynamique

Mémoire d’un ordinateurMémoire d’un ordinateur

27

Adresse

i=27pi = adresse(i); /* adresse de la cellule mémoire qui

contient la valeur 27 */

Les pointeurs en C : Les pointeurs en C : les opérateurs * et &les opérateurs * et &

• int i, j, *ip;• i=11;• ip= &i;• j=21;

i j ip

11 21 Ad(i)

• *ip=j;

i j ip

21 21 Ad(i)

Les pointeurs en C : Les pointeurs en C : déclaration de typesdéclaration de types

• int i• int *pi• int **ppi• int it[]• int *pit[]• int *if()• int (*ipf)()

Priorité : * < [] < ()

→Un entier→Pointeur vers un entier→Pointeur de pointeur d’entier→Tableau d’entier→Tableau de pointeurs d’entier→Fonction retournant un pointeur d’entier→Pointeur de fonction retournant un entier

Page 2: 8-pointeurs-C.pdf

2

Les pointeurs en C :Les pointeurs en C :passage par adresse (1)passage par adresse (1)

• passage par valeur , int f1(int a, int b) : la fonction f1 crée une copie des variables « a » et « b »

• passage par adresse, int f2(int *a, int *b) : la fonction f2 peut modifier le contenu des variables « a » et « b »de la fonction appelante

Les pointeurs en C :Les pointeurs en C :passage par adresse (2)passage par adresse (2)

void echange(int a, int b){

int tmp;tmp = a;a = b;b = tmp;

}a =11;b = 27;echange(a,b);

void echange(int *a, int* b){

int tmp;tmp = *a;*a = *b;*b = tmp;

}a =11;b = 27;echange(&a,&b);

a et b inchangées a et b échangées

Les pointeurs en C :Les pointeurs en C :passage par adresse (3)passage par adresse (3)

•int f3(int a[], int b), « a » passage par adresse : les modifications du tableau « a » seront répercutées au niveau de la fonction appelante.

•Une variable définit comme un tableau est transmise comme un pointeur : a[n] == *(a+n)

enum/sizeof

Les pointeurs en C : Les pointeurs en C : les tableauxles tableaux

• int ti[];• double td[];• char tc[];• struct nœud tn [];

struct nœud {int i;struct nœud *s;

} t[i] = *(t+i)

i i+1

TD/sizeof.c

Les pointeurs en C Les pointeurs en C ne sont pas des entiersne sont pas des entiers

• Si p est un pointeur : int *p, i;p++ : pointe sur l’élément suivant, p+ = i : pointe sur le ième élément suivant,incrémente d’après la taille de l’élément

• Différence entre pointeurs, mais pas d’addition

• Si t est un tableau : int t[100], *p;p = &t[0] est correcte, de même p = tmais pas t = p ou t++ ou p = &t

Les pointeurs en C :Les pointeurs en C :structstruct et unionet union

• struct nœud { union uni {int val; int i;struct nœud *s; double d;

} n, *pn; } u, *pu;

Les seules opérations possibles : -prendre l’adresse avec & : pn = &n-accéder une valeur :

n.val = 11 ou pn->val = 11 ou *pn.val = 11

Page 3: 8-pointeurs-C.pdf

3

Les pointeurs en C :Les pointeurs en C :retour de fonctionretour de fonction

• Une fonction peut retourner :– des types simples : char, short, int, unsigned, long,

double– ou un pointeur vers un tel type

• Une fonction ne peut retourner que des pointeurs de fonction, struct ou union

• Pas de valeur retournée :– void uneFonction()

Les pointeurs en C :Les pointeurs en C :les fonctionsles fonctions

• int uneFonction(), (*pf)() :-adresse de la fonction:

pf = uneFonction-exécuter la fonction : (*pf)()

• Un pointeur de fonction :-n’est pas une variable-peut-être assigné à un tableau

Les pointeurs en C :Les pointeurs en C :les fonctions (2)les fonctions (2)

int main(){/* un pointeur de fonction retournant un entier */

int (*pf)();/* un tableau de pointeurs de fonction retournant un entier */

int (*tpf1[10])();int (*tpf1)())[];

/* un tableau de pointeurs de fonction retournant un entier */

typedef int (*pF)();pF tpf[10];

hello(1);

pf = hello2;

(*pf)();tpf[0] = hello3;

(*tpf[0])();tpf1[0] = hello4;

(*tpf1[0])();}

Faux

TD/ptrfontion.c.html

ExempleExemplestruct donnée {

int type;object *pObjet;

}

switch obj.type {RECT CERCLEPOLY

}

(*affiche[obj.type])(pObjet);

Les pointeurs en C :Les pointeurs en C :conversion de pointeurs (2)conversion de pointeurs (2)

•Définition de type : –typedef ENTIER int; typedef ptrENTIER *int;

•Fonction scanf (contrôle, arg1, arg2, ..) : lecture standard (stdin); sscanf, fscanf

–char *str="25 années 15.3" ; int i; double f;

–sscanf(str, "%d %*s %f" , &i,&f)

Les pointeurs en C :Les pointeurs en C :allocation dynamiqueallocation dynamique

• void* calloc(n,sizeof(Type)) : alloue un espace de taille sizeof(Type) et cela « n » fois

• void * malloc(n) : alloue un espace de n octets

Page 4: 8-pointeurs-C.pdf

4

Les pointeurs en C :Les pointeurs en C :allocation dynamique (2)allocation dynamique (2)

•void *realloc(p, n) : libère l’espace alloué à p, et réalloue n octets

• void free(p) : libère l’espace alloué

Les pointeurs en C :Les pointeurs en C :conversion de pointeursconversion de pointeurs

• Les fonctions d’allocation d’espace retourne un pointeur de void qui pointe sur l’espace alloué

• Conversion de type : – pType = (Type *)malloc(n*sizeof(Type))

Exercice 1: Exercice 1: mallocmalloc et freeet free

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

Saisir la taille de la zone : taille

Si > 0 alors

Saisir la chaine

Vérifier la taille : taille < longueur !!!! erreur

Afficher la chaine

Libérer l'espace

int strlen()void * malloc(n)void free(p)

http://www-bio3d-igbmc.u-strasbg.fr/~wurtz pointeur/allocation.c

Exercice 2 : tableau, avec allocation Exercice 2 : tableau, avec allocation dynamique de la tailledynamique de la taille

#define BLOC 2Variables globales :

int compteur=0, taille=0;int *tableau;

Fonctions :int inserer(int i)

int inserer(int i)-taille du tableau suffisant ? :

realloc-insérerl'entier comme avant

#include <stdio.h>

#include <stdlib.h>

http://www-bio3d-igbmc.u-strasbg.fr/~wurtz

TD/TD1-tableau1.c

pointeur/tableau1_malloc.c

Exercice 3 : tableau de chaîne de caractèresExercice 3 : tableau de chaîne de caractères

#define BLOC 2Variables globales :

int taille=0, compteur=0;char *tableau[];

Fonctions :int inserer(char *s)void afficher()int supprimer(char *s)

free()

int inserer(char *s)-taille du tableau suffisant ? :

malloc, realloc-insérer la chaîne s :

malloc

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

http://www-bio3d-igbmc.u-strasbg.fr/~wurtz pointeur/tableau1-char-malloc.c

TD/TD1-tableau1.c

Exercice 3 : tableau de chaîne de caractères (2)Exercice 3 : tableau de chaîne de caractères (2)

int main() {char t[20];

strcpy(t, "Marie"); inserer(t);strcpy(t, "Robert"); inserer(t);strcpy(t, "Anne"); inserer(t);inserer("Albert");inserer("Yann");inserer("Rose");inserer("Myriam");affiche();

}

Page 5: 8-pointeurs-C.pdf

5

Créer une structure de données Créer une structure de données décrivant un pointdécrivant un point

• un point a 2 composantes :x et y

• Description en C?• struct Point {

double x, y;}

• Définition d'une variable Pointstruct Point pnt = {1.5,3.0};struct Point p1, *p2;// accès aux champs x et y de pntp1 = pnt; // tester cette assignationp2 = &pnt; // comment accéder les

//champs x et y de p2

typedef struct Point {double x, y;

} TPoint;

TPoint pnt = {1.5,3.0};TPoint p1, *p2;

Utilisation de typedef

Décrire des formes géométriquesDécrire des formes géométriques

• Un cercle : son centre et le rayon• un carré : son centre et le coté• un rectangle : son centre et la hauteur et la largeur• un polygone : un nombre quelconque de points ( > 3) avec

comme centre le centre de masse des points• Décrire les structures de données et les fonctions

d'initialisation :struct Cercle {

struct Point c; // le centredouble r; // le rayon

}struct Cercle * créerCercle(struct Point *c, double r)

//une variable cercle //et un pointeur de cercleStruct Cercle ce, *pce;

Décrire un type CercleDécrire un type Cercle

#define CERCLE 0typedef struct Cercle {

TPoint centre; // le centredouble rayon; // le rayon

} TCercle;TCercle * créerCercle(TPoint *c, double r)

//une variable cercle //et un pointeur de cercleTCercle ce, *pce;

• Un cercle : son centre et le rayonstruct Cercle {

struct Point c; // le centredouble r; // le rayon

}struct Cercle * créerCercle(struct Point *c, double r)

//une variable cercle //et un pointeur de cercleStruct Cercle ce, *pce;

Décrire un polygoneDécrire un polygone

• #define POLYGONE 3• typedef struct Polygone {

TPoint centre; //le centre de masseint taille; // nbre de pointsTPoint *poly; //la liste des points

} TPolygone;

• TPolygone * creerPolygone(TPoint tp[], int taille)• void affPolygone(TPolygone *po)

Gérer une liste de forme Gérer une liste de forme géométriquegéométrique

• Stocker ces formes dans un tableau :struct Forme tabForm[];

• struct Forme {????}• Remplir le tableau forme un cercle, carré, un

rectangle et un polygone• Puis lister pour chaque élément du tableau son

type, un nom, et ses attributs– écrire une fonction afficheCercle(struct Cercle * pc)

Gérer une liste de forme Gérer une liste de forme géométrique(2)géométrique(2)

• puis définir un type forme quelconque qui aura comme membres :– un type : le type de l'objet– un pointeur vers une des forme géométrique