Algorithmique et Structures de Données 2 - TP N°4 : LES POINTEURS
Ce TP porte sur la manipulation des pointeurs en langage C, avec un accent sur l’allocation dynamique de mémoire, la gestion de tableaux via pointeurs, et l’utilisation de structures complexes. Il permet d’acquérir des compétences pratiques en gestion mémoire, en manipulation de tableaux dynamiques et en programmation structurée avec pointeurs.
D'après le document Algorithmique et Structures de Données 2 - TP N°4 : LES POINTEURS
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Document source
Programming, Data Structures, C Language · PDF · 3 pages · 2019
Afficher l'aperçu du document
Ce TP porte sur la manipulation des pointeurs en langage C, avec un accent sur l’allocation dynamique de mémoire, la gestion de tableaux via pointeurs, et l’utilisation de structures complexes. Il permet d’acquérir des compétences pratiques en gestion mémoire, en manipulation de tableaux dynamiques et en programmation structurée avec pointeurs. Pour suivre ce TP, il faut disposer d’un compilateur C et d’un environnement de développement permettant d’exécuter des programmes en C.
Objectifs
- Allouer et libérer dynamiquement de la mémoire avec malloc et free.
- Utiliser la syntaxe des pointeurs pour manipuler des tableaux.
- Écrire des fonctions pour saisir, afficher et analyser des tableaux d’entiers.
- Corriger et comprendre un programme C utilisant des tableaux dynamiques.
- Manipuler des structures contenant des pointeurs vers des chaînes de caractères.
- Développer des fonctions récursives pour traiter des structures complexes.
Prérequis et configuration
- Connaissances de base en langage C (variables, pointeurs, tableaux, structures).
- Compilateur C standard (gcc ou équivalent).
- Environnement permettant d’exécuter des programmes en C.
- Compréhension de la gestion dynamique de la mémoire (malloc, free).
- Notions sur la manipulation des chaînes de caractères via pointeurs.
Exercice 1 : Allocation dynamique et affichage de pointeurs
Dans cet exercice, vous devez créer un programme C qui déclare deux pointeurs sur des réels, réserve dynamiquement de la mémoire pour chacun, affecte des valeurs, affiche les adresses et les valeurs, puis libère la mémoire.
Étapes à suivre :
- Déclarez deux pointeurs
p1etp2de typefloat *. - Utilisez
mallocpour réserver la mémoire nécessaire à unfloatpour chacun. - Affectez la valeur
-67.3à l’emplacement pointé parp1et345.89à celui pointé parp2. - Affichez les adresses contenues dans
p1etp2ainsi que les valeurs pointées. - Libérez la mémoire allouée avec
free.
Remarque : Dans la suite du TP, il est obligatoire d’utiliser la syntaxe des pointeurs pour manipuler les tableaux.
Exercice 2 : Fonctions de saisie, affichage et analyse d’un tableau d’entiers
Vous devez écrire plusieurs fonctions manipulant un tableau d’entiers via des pointeurs.
- SaisirTab(int *tab, int n) : cette fonction permet de saisir
nentiers et de les stocker dans le tableau pointé partab. - PlusSouvent(int *tab, int n) : cette fonction détermine l’élément qui apparaît le plus souvent dans le tableau.
- AfficherTab(int *tab, int n) : cette fonction affiche les
nentiers contenus dans le tableau.
Ensuite, écrivez un programme principal main() qui :
- Saisit un nombre
md’entiers dans un tableau dynamiqueT. - Affiche le contenu du tableau.
- Affiche l’élément qui apparaît le plus souvent dans ce tableau.
Exercice 3 : Correction et analyse d’un programme avec tableau dynamique
Le programme donné crée un tableau dynamique d’entiers et initialise chaque case avec le double de son indice. Il contient plusieurs erreurs à corriger.
# include <stdio.h>
# include <stdlib.h>
main() {
int T[N];
int i;
printf("Saisir la taille du tableau : ");
scanf("%d", N);
T = (int*) malloc(sizeof(int));
for(i=1; i<N;i++)
T[i] = i*2
}
Étapes :
- Corrigez les erreurs de déclaration et d’allocation mémoire.
- Assurez-vous que la taille
Nest correctement lue et utilisée. - Allouez un tableau dynamique de taille
Navecmalloc. - Initialisez chaque élément
T[i]aveci*2, en commençant ài=0.
Supposons que l’utilisateur saisisse 8 comme taille, le tableau doit contenir :
0 2 4 6 8 10 12 14
Ensuite, avec les déclarations :
int *p, x;
p = T;
Évaluez les expressions suivantes :
- a)
x = *T: valeur pointée parT(élément 0) - b)
p = p + 6: déplacement du pointeur de 6 éléments - c)
*p = *p - 2: décrémentation de la valeur pointée parpde 2 - d)
p = p - 4: déplacement du pointeur en arrière de 4 éléments - e)
*p = *p + *(T + 5): addition de la valeur pointée parT+5à la valeur pointée parp
Enfin, donnez le nouveau contenu du tableau T après ces opérations.
Exercice 4 : Structures et pointeurs dynamiques
Reprenez l’exercice sur les joueurs de rugby (TP9) en utilisant uniquement la syntaxe des pointeurs, sans utiliser la syntaxe des tableaux. Le tableau de structures contenant les 15 joueurs doit être alloué dynamiquement.
La structure JOUEUR est définie ainsi :
typedef struct {
int num;
char *nom;
char *pren;
float poids;
} JOUEUR;
Les champs nom et pren sont des pointeurs vers des chaînes de caractères allouées dynamiquement, supposées de taille 20.
Objectifs :
- Allouer dynamiquement un tableau de 15 joueurs.
- Allouer dynamiquement les chaînes de caractères pour
nometprende chaque joueur. - Utiliser uniquement la syntaxe des pointeurs pour accéder et modifier les données.
Exercice 5 : Gestion de structures imbriquées et fonctions récursives
On considère les structures suivantes :
typedef struct {
int ncin; // numéro CIN du participant
char nom[20]; // nom du participant
char prenom[20]; // prénom du participant
} PARTICIPANT;
typedef struct {
int identifiant; // identifiant de la compétition
char nom_comp[10]; // nom de la compétition
PARTICIPANT tab[20]; // tableau des participants
} COMPETITION;
Étapes à réaliser :
- Développer la fonction
saisir_participant()qui saisit toutes les informations d’un participant et retourne la structure correspondante. - Développer la fonction
saisir_competitions(COMPETITION *C, int n)qui saisit les informations relatives àncompétitions en utilisant uniquement la syntaxe des pointeurs (pas de syntaxe tableau). - Développer la fonction récursive
nbre_comp(COMPETITION *C, int n, int ncin)qui retourne le nombre de compétitions auxquelles un participant, identifié par sonncin, a participé. - Écrire un
mainqui : - Saisit le nombre total
nde compétitions (non négatif). - Alloue dynamiquement un tableau
Comp013dencompétitions. - Saisit les données des
ncompétitions. - Saisit le
ncind’un participant et affiche le nombre de compétitions auxquelles il a participé.
Résultats attendus
- Exercice 1 : affichage correct des adresses des pointeurs et des valeurs
-67.3et345.89. - Exercice 2 : saisie correcte des entiers, affichage fidèle du tableau, et identification correcte de l’élément le plus fréquent.
- Exercice 3 : correction complète du programme, tableau dynamique initialisé avec les valeurs
0, 2, 4, 6, 8, 10, 12, 14pourN=8, et mise à jour correcte du tableau après les opérations sur le pointeurp. - Exercice 4 : allocation dynamique réussie du tableau de joueurs et des chaînes de caractères, manipulation uniquement par pointeurs.
- Exercice 5 : saisie complète des participants et compétitions, fonction récursive retournant le nombre correct de participations pour un
ncindonné.
Pièges courants
- Oublier de libérer la mémoire allouée dynamiquement, ce qui peut provoquer des fuites mémoire.
- Confondre la syntaxe des pointeurs et celle des tableaux, notamment en manipulant les indices.
- Ne pas allouer assez de mémoire pour les chaînes de caractères dans les structures.
- Ne pas initialiser correctement la taille des tableaux dynamiques avant allocation.
- Dans l’exercice 3, oublier de déclarer
Ncomme variable et de passer son adresse àscanf. - Dans les fonctions récursives, ne pas prévoir le cas de base, ce qui peut entraîner une récursion infinie.
- Lors de la manipulation des pointeurs, faire des décalages incorrects qui pointent hors des limites du tableau.
Commentaires
Aucun commentaire pour le moment. Posez la première question.