Vous êtes sur la page 1sur 4

-‫املركز اجلامعي الشهيد يس احلواس –بريكة‬

‫قسم التكوين القاعدي (اجلذع املشرتك) للرايضيات والإعالم الآيل‬


Module: A.S.D 2
SERIE D’EXERCICES DE TD/TP N° 09 (Les pointeurs)
Exercice N° 01 :
Soit les instructions suivantes : int x=5, * pX = &x;
Ecrire les instructions permettant d’afficher : double y = 6.38 , * pY = &y;
a) Les valeurs des variables x et y.
b) Les adresses des variables x et y.
c) Les valeurs des variables x et y en utilisant les pointeurs pX et pY.
d) Les adresses des variables x et y en utilisant les pointeurs pX et pY.
Solution
printf("La valeur de la variable x= %d\n", x);
printf("La valeur de la variable y= %lf\n", y);
printf("L'adresse de la variable x= %p\n", &x);
printf("L'adresse de la variable y= %p\n", &y);
printf("La valeur de la variable x en utilisant les pointeurs= %d\n", *pX);
printf("La valeur de la variable y en utilisant les pointeurs= %lf\n", *pY);
printf("L'adresse de la variable x en utilisant les pointeurs= %p\n", pX);
printf("L'adresse de la variable y en utilisant les pointeurs= %p\n", pY);
Exercice N° 02 :
Trouvez les erreurs dans les suites d’instruction suivantes :
a) int *p , x = 34; *p = x
b) int x = 17 , *p = x; *p = 17
c) double *q; int x = 17 , *p; p = &x; q =p;
d) int x, *p; &x = p;
Solution
a) *p = x est incorrect parce que le pointeur p n’est pas initialisé
b) p = x est incorrect. Pour que p pointe sur x :p = &x
c) q = p incorrect. q et p deux pointeurs sur des types différent
d) &x = p incorrect. &x n’est pas une variable (lvalue) et par conséquent ne peut pas figurer à gauche d’une affectation.
Exercice N° 03 :
Complétez le tableau suivant pour chacune des instructions.

Solution
A B C P1 P2 A B C P1 P2
Init. 123/ / Init. 1 23/ /
P1=&A 1 2 3 &A / P1=&A 1 2 3 &A /
P2=&C P2=&C 1 2 3 &A &C
*P1=(*P2)++ *P1=(*P2)++ 3 2 4 &A &C
P1=P2 P1=P2 3 2 4 &C &C
P2=&B P2=&B 3 2 4 &C &B
*P1-=*P2 *P1-=*P2 3 2 2 &C &B
++*P2 ++*P2 3 3 2 &C &B
*P1*=*P2 *P1*=*P2 3 3 6 &C &B
A=++*P2**P1 A=++*P2**P1 24 4 6 &C &B
P1=&A P1=&A 24 4 6 &A &B
*P2=*P1/=*P2 *P2=*P1/=*P2 6 6 6 &A &B
Exercice N° 04 :

Soit P un pointeur qui 'pointe' sur un tableau A:

int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
a) *P+2 => la valeur 14
Quelles valeurs ou adresses fournissent ces
expressions: b) *(P+2) => la valeur 34
c) &P+1 => l'adresse du pointeur derrière le pointeur P
a) *P+2 d) &A[4]-3 => l'adresse de la composante A[1]
b) *(P+2)
c) &P+1 e) A+3 => l'adresse de la composante A[3]
d) &A[4]-3 f) &A[7]-P => la valeur (indice) 7
e) A+3 g) P+(*P-10) => l'adresse de la composante A[2]
f) &A[7]-P
g) P+(*P-10) h) *(P+*(P+8)-A[7]) => la valeur 23
h) *(P+*(P+8)-A[7])
Exercice N° 05 :
Écrire, de deux façons différentes, une fonction qui ne renvoie aucune valeur et qui détermine la valeur maximale
et la valeur minimale d’un tableau d’entiers (à un indice) de taille quelconque. Il faudra donc prévoir 4 arguments :
le tableau, sa dimension, le maximum et le minimum.
● en utilisant uniquement le « formalisme tableau »,
● en utilisant le « formalisme pointeur », chaque fois que cela est possible.
Écrire un petit programme d’essai.

Solution

#include <stdio.h>
#include <stdlib.h>
void maxmin (int t[], int n, int * admax, int * admin){
int i, max, min ;
max = t[0] ;
min = t[0] ;
for (i=1 ; i<n ; i++){
if (t[i] > max) max = t[i] ;
if (t[i] < min) min = t[i] ;
}
*admax = max ;
*admin = min ;
}

void maxmin2 (int *t, int n, int * admax, int * admin){


int i, max, min ;
max = min = *t ;
for (i=1 ; i<n ; i++){
if (*(t+i) > max) max = *(t+i) ;
if (*(t+i) < min) min = *(t+i) ;
}
*admax = max ;
*admin = min ;
}

int main(){
void maxmin (int [], int, int *, int *) ;
int t[8] = { 2, 5, 7, 2, 9, 3, 9, 4} ;
int max, min ;
maxmin (t, 8, &max, &min) ;
printf ("valeur maxi : %d\n", max) ;
printf ("valeur mini : %d\n", min) ;
}
Exercice N° 06 :

Écrire une fonction calculant la somme de deux matrices dont les éléments sont de type double. Les adresses des
trois matrices et leurs dimensions (communes) seront transmises en argument.

void sommat (double * a, double * b, double * c, int n, int p)


{ int i ;
for (i=0 ; i<n*p ; i++)
*(c+i) = *(a+i) + *(b+i) ;

Exercice N° 07 :
Écrire un programme C permettant à un enseignant de saisir le nombre d’étudiants d’une classe dont il est en charge et allouer
dynamiquement l’espace juste nécessaire pour contenir leurs notes. Donner la main à l’enseignant pour saisir ses notes, puis
calculer et afficher la moyenne de la classe.

#include<stdio.h>
#include<stdlib.h>

int main()
{
float *p, sum = 0;
int i, n;

printf("Enter the number of students: ");


scanf("%d", &n);

// allocate memory to store n variables of type float


p = (float*)malloc(n*sizeof(float));

// if dynamic allocation failed exit the program


if(p==NULL)
{
printf("Memory allocation failed");
exit(1); // exit the program
}

// ask the student to enter marks


for(i = 0; i < n; i++)
{
printf("Enter marks for %d student: ", i+1);
scanf("%f", p+i);
}

// calculate sum
for(i = 0; i < n; i++)
{
sum += *(p+i);
}

printf("\nAverage marks = %.2f\n", sum/n);

// signal to operating system program ran fine


return 0;
}
Exercice N° 08 :
Écrire un programme C permettant l’allocation dynamique de la mémoire requise pour enregistrer N chaînes de caractères de
M caractère chacune. Tester votre programme en saisissant 03 mots.

#include <stdio.h>
#include <stdlib.h>
#define N 3
#define M 5
int main(){
int i;
char** A = NULL; // char* is a string.
// char** is an array of strings
if ((A = malloc(N)) != NULL){
for (i=0;i<N;i++)
A[i] = (char*)malloc(M);
}
else{
printf("malloc failed: Exiting Program!\n\n");
exit( EXIT_FAILURE );
}
for (i=0;i<N;i++)
gets(A[i]);
for (i=0;i<N;i++)
printf("mot %d = %s\n", i,A[i]);
free(A);
return 0;
}