Vous êtes sur la page 1sur 5

ALGORITHMIQUE ET LANGAGE C – L1S2–MPI TD 4 – GROUPE D1

ROSELINE DESCOUT-RENIER JEUDI 20 FÉVRIER 2014

Objectifs de la séance :
• Notion de pointeur et de référence ;
• Déclaration et utilisation de structures ;
• Validité d’écritures sur les pointeurs et les structures.

Exercices étudiés pendant la séance : 1 – 2 – 3 – 4 – 8 TD4.

Exercice 1 :

Code : x y z *p *q *r Commentaires
int x = 100, y = 50, z = 200 ; 100 50 200
int * p = &z ; 200 p pointe l’adresse de z
int * q = &y ; 50 q pointe l’adresse de y
int * r = &x ; 100 r pointe l’adresse de x
printf() ; 100 50 200 200 50 100
Si x change, la valeur pointée par r
x=x+y; 150 150
change aussi.
printf() ; 150 50 200 200 50 150
Si z change, la valeur pointée par p
z=z–y; 150 150
change aussi.
printf() ; 150 50 150 150 50 150
p = &Tab[0] ; 9 Si p pointe sur un autre espace
mémoire, p ne pointe plus la même
valeur mais z ne change pas.
La valeur pointée par p vaut 9 – on lui
printf(“ \n%d %d ”, (*p + 1), (*p + 2)) ;
ajoute une ou deux unités : 10 11
printf(“ \n%d %d ”, *(p + 1), *(p + 2)) ; La valeur pointée par p est la première
du tableau. On se décale d’un ou deux
crans dans le tableau : 4 7
for (i = 0 ; i <= n ; i++) { *(p+n) : on démarre le parcours sur la
dernière case du tableau.
printf(“ \n%d ”, *(p+n-i)) ;
*(p+n-i) : on se décale vers le début
} du tableau : 1 5 2 7 4 9

Conclusion : Ne pas oublier de coupler une valeur (par exemple x) et son pointeur (ici r)
→ Si x change, alors *r change simultanément.
Exercice 2 :

Code x y z s *p *q *r Commentaires
int x = 10, y = 100, z = 1000, s ; 10 100 1000
int * p, *q, *r ;
int tab[10] = {3, 2, 5, 7, 9, 4, 9, 6, 8, 0} ;
p = &z ; 1000
q = &x ; 10
r=q; 10
printf() ; 10 100 1000 1000 10 10
100 100 *p = *p / *q ;
*q = *p /= *q ;
100 100 100 *q = *p ;
printf() ; 100 100 100 100 100 100
p = &tab[0] ; 3
q = &tab[9] ; 0 0
p = 3, q = 0, q – p = 9
q – p désigne l’écart
printf() ;
d’espace mémoire entre
q et p, or q = p + 9.
s=0; 0 3 0
while (p != q) { 3 2 0
5 5 0
s += *p ; 10 7 0
17 9 0
26 4 0
30 9 0
p++ ; 39 6 0
45 8 0
} 53 0 0
printf() ; s = 53
p = tab ; équivalent à p = &tab[0] ;
while (p != q) { 3 0 0
3 8 8
if (*q %2 == 0) { 3 6 6
3 9
printf(“ %d ”, *q) ; 3 4 4
3 9
}
3 7
q-- ; 3 5
3 2 2
} 3 3
Exercice 3 :

Commande Valeur Adresse Commentaire


*P + 2 14 Valeur pointée par P + 2 = 12 + 2
Décalage de deux espaces mémoire par
*(P+2) 34
rapport à l’adresse pointée par P
Décalage de trois espaces mémoire vers la
&tab[4] – 3 &tab[1]
gauche en partant de &tab[4]
tab + 3 &tab[3]
Combien de crans d’espaces mémoire entre
&tab[7] – &tab[1] 6
&tab[7] et &tab[1]
&tab[7] – P 7
P + (*P – 10) &tab[2] *P – 10 = 2
tab[7] = 89
*(P+8) = 90
*(P + *(P + 8) – tab[7]) 23
90 – 89 = 1
*(P+1) = 23

Remarque : en toute rigueur, &tab[7] – &tab[1] vaut plutôt 6 × sizeof(int) puisque ce tableau contient des int.

Conclusion : commencer par s’interroger sur le type de réponse : valeur ou adresse.

Exercice 4 :

p1→nom[0] OK notation → pour un pointeur


p2.prenom[1] non notation . impossible pour un pointeur
p2→nom[20] non pas de 21ème caractère à la chaîne nom
c1→nom[2] non notation → impossible pour une variable
c2.prenom[3] OK notation . OK pour une variable
&ch2[3] - &ch2[2] OK valeur 1
c1 == c2 non pas de comparaison possible entre deux structures
p1 == p2 OK comparaison possible entre deux pointeurs

c1 = c2 ; OK affectation de toutes les caractéristiques de c2 à l’identique de c1


c1→nom[4] = c2→nom[5] ; non notation → impossible pour une variable
c1.nom = c2.nom ; OK
c1→prenom = ch1 ; non notation → impossible pour une variable
p1 = p2 ; OK
Exercice 8 :

#include <stdio.h>
#define DIM 5

int main(void) {
/* Déclaration de la structure date */
struct date {
int jour;
int mois;
int an;
};

/* Déclaration d’une variable de type date */


struct date evenement;
evenement.jour = 20;
evenement.mois = 2;
evenement.an = 2014;

/* Déclaration d’un pointeur sur la date "evenement" */


struct date * pDate;
pDate = &evenement;

/* Affichage de la date sans le formalisme pointeur */


printf("\nAujourd’hui, nous sommes le %d.%d.%d (méthode sans pointeur).\n", evenement.jour, evenement.mois,
evenement.an);

/* Affichage de la date avec le formalisme pointeur */


printf("\nAujourd’hui, nous sommes le %d.%d.%d (méthode avec pointeur).\n", pDate->jour, pDate->mois,
pDate->an);

/* Déclaration d’un tableau de dates */


struct date tab[DIM];
int i;
for (i = 0; i < DIM; i++) {
tab[i].jour = i + 5;
tab[i].mois = i + 2;
tab[i].an = 2014;
}

struct date * pDate2;


pDate2 = &tab[0];

/* Affichage du contenu du tableau sans le formalisme pointeur */


printf("\nContenu du tableau (sans pointeur) :\n");
for (i = 0; i < DIM; i++) {
printf("\nDate %d : %d.%d.%d\n", i, tab[i].jour, tab[i].mois, tab[i].an);
}

/* Affichage du contenu du tableau avec le formalisme pointeur */


printf("\nContenu du tableau (avec pointeur) :\n");
for (i = 0; i < DIM; i++) {
printf("\nDate %d : %d.%d.%d\n", i, pDate2->jour, pDate2->mois, pDate2->an);
pDate2++;
}
/* Utilisation du pointeur pour écrire les valeurs contenues dans le tableau */
printf("\nUtilisation du pointeur pour écrire le contenu du tableau.\n");
pDate2 = &tab[0];
for (i = 1; i <= DIM; i++) {
printf("\nEntrez le jour %d :", i);
scanf("%d", &pDate2->jour);
printf("\nEntrez le mois %d :", i);
scanf("%d", &pDate2->mois);
printf("\nEntrez l’année %d :", i);
scanf("%d", &pDate2->an);
pDate2++;
}
printf("\nContenu du nouveau tableau :\n");
pDate2 = &tab[0];
for (i = 0; i < DIM; i++) {
printf("\nDate %d : %d.%d.%d\n", i + 1, pDate2->jour, pDate2->mois, pDate2->an);
pDate2++;
}

return 0;
}

Vous aimerez peut-être aussi