Post on 18-Feb-2016
description
DUT Informatique Conception de structures de donnees Annee 2012/2013
TD 1 - Pointeurs -
Exercice 1. Pointeurs
1. Quelle difference y a-t-il entre les deux programmes suivants ?
main(){
int i = 3, j = 4;
int *p1, *p2;
p1 = &i; p2 = &j;
*p1 = *p2;
}
main(){
int i = 3, j = 4;
int *p1, *p2;
p1 = &i; p2 = &j;
p1 = p2;
}
2. Etant donnees ces declarations/initialisations, que valent les expressions dans le tableau ?
typedef struct toto{ int a; int b;} Toto;
int i1=1, i2=i1;
int *p1=&i1, *p2=&i2, *p3=&i2;
*p2=2;
Toto t1 = {1,2}, t2 = {1,2};
Toto *pt1=&t1, *pt2=&t2, *pt3=pt2;
(i1==i2)
(p1==p2)
(p2==p3)
(*p2==*p3)
(t1==t2)
(t1.a==t2.a)
(pt1==pt2)
(pt2==pt3)
(*pt1==*pt2)
3. Decrire et expliquer le resultat de l’execution du programme suivant :
1 void f0(int *tab, int lg){
2 int *q=tab;
3 do printf("%d:%d ", q-tab, *q-*tab);
4 while (++q-tab < lg);
5 printf("\n");
6 }
78 void f1(int *c, int *s){ c=s; }
910 void f2(int **c, int *s){ *c=s; }
1112 void main (){
13 int lg = 5;
14 int foo[] = {1,9,4,10,17};
15 int *bar = calloc(lg, sizeof(int));
1617 printf("foo : "); f0(foo, lg);
18 f1(bar, foo); printf("bar : "); f0(bar, lg);
19 f2(&bar, foo); printf("bar : "); f0(bar, lg);
20 }
1
Exercice 2. Allocation de matricesOn suppose que l’on dispose d’un type Pixel : typedef struct ... Pixel;
Ecrire la fonction qui alloue de l’espace pour un tableau de nb de Pixels et renvoie un pointeursur cet espace. Ecrire les 2 fonctions qui allouent et liberent de l’espace pour une matrice r × cde Pixels.
a. Pixel *allocArrayPixels(int nb);
b. Pixel **allocMatrixPixels(int r, int c);
c. void freeMatrixPixels(Pixel **t, int r);
Exercice 3. Allocation de matrices (bis)Refaire l’exercice precedent de telle facon que les matrices a allouer soient passees en parametres(du coup, le type de retour des fonctions est void).
Exercice 4. Fichier et tableauOn considere le format de fichiers d’entiers suivant : Le premier nombre est le nombre d’entiers.Les nombres suivants representent les entiers separes par des espaces ou des passages a la ligne :N n1 n2 ... nN
Ecrire l’en-tete d’une fonction qui :
1. ouvre un fichier dont le nom est passe en parametre ;
2. qui alloue dynamiquement un tableau d’entiers de la bonne taille ;
3. qui lit les entiers dans le fichier et les met dans le tableau ;
4. qui retourne le tableau ;
5. qui place le nombre d’elements du tableau dans une variable passee en parametre.
Exercice 5. DebbugageDans le TP precedent, se trouve la question : ”Ecrire une fonction max qui renvoie le maximumd’un tableau passe en parametre ainsi que son indice.”
Voici l’une des reponses proposees. Qu’en pensez-vous ?
1 int dichotomie( int tab[], int n, int nb_a_chercher ){ ... }
23 int max(int *t, int taille){
4 int i;
5 int maxi;
6 for(i=0;i<taille;i++)
7 if(t[i]>t[i+1])
8 maxi=t[i];
9 int a=dichotomie(t, taille, maxi);
10 int *p=&a;
11 return maxi;
12 }
1314 int main(int argc, char *argv[]){
15 int *p;
16 int tab[5]={45,2,6,489,1};
17 printf("Le maximum du tableau est %d a l’indice n=%d", max(tab,5), *p);
18 return 0;
19 }
2