Upload
ayoub-maghouz
View
5
Download
2
Embed Size (px)
Citation preview
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
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
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
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();
}
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