Ce guide propose des exercices corrigés sur les pointeurs en C, allant des bases aux cas avancés. Il vise à renforcer la compréhension de concepts tels que la manipulation de mémoire, les pointeurs de fonctions, les chaînes de caractères dynamiques et les structures.
Créez un programme qui utilise un pointeur pour afficher et modifier la valeur d’une variable.
#include <stdio.h>
int main() {
int a = 10;
int *p = &a;
printf("Valeur initiale de a : %d\n", *p); // Afficher la valeur via le pointeur
*p = 20; // Modifier la valeur via le pointeur
printf("Nouvelle valeur de a : %d\n", a);
return 0;
}
Écrivez une fonction qui échange les valeurs de deux variables en utilisant des pointeurs.
#include <stdio.h>
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
int main() {
int a = 5, b = 10;
printf("Avant échange : a = %d, b = %d\n", a, b);
swap(&a, &b); // Passer les adresses
printf("Après échange : a = %d, b = %d\n", a, b);
return 0;
}
Implémentez un programme qui affiche les éléments d’un tableau en utilisant des pointeurs.
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *p = arr;
for (int i = 0; i < 5; i++) {
printf("Élément %d : %d\n", i, *(p + i)); // Accès via le pointeur
}
return 0;
}
*(p + i)
est équivalent à arr[i]
.Écrivez un programme qui copie une chaîne de caractères dans une mémoire allouée dynamiquement.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char source[] = "Pointeurs en C";
char *dest = (char *)malloc((strlen(source) + 1) * sizeof(char));
if (dest == NULL) {
printf("Erreur d'allocation mémoire\n");
return 1;
}
strcpy(dest, source);
printf("Chaîne copiée : %s\n", dest);
free(dest); // Libérer la mémoire
return 0;
}
malloc
est utilisé pour allouer suffisamment de mémoire.free
.Allouez dynamiquement un tableau 2D, assignez des valeurs, puis affichez-les.
#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 3, cols = 4;
int **matrix = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
matrix[i] = (int *)malloc(cols * sizeof(int));
}
// Remplir le tableau
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = i * cols + j;
}
}
// Afficher le tableau
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
// Libérer la mémoire
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
return 0;
}
Implémentez un programme qui utilise un pointeur de fonction pour appeler dynamiquement des fonctions.
#include <stdio.h>
void add(int a, int b) {
printf("Addition : %d\n", a + b);
}
void multiply(int a, int b) {
printf("Multiplication : %d\n", a * b);
}
int main() {
void (*operation)(int, int);
operation = add;
operation(5, 3); // Appeler add via le pointeur
operation = multiply;
operation(5, 3); // Appeler multiply via le pointeur
return 0;
}
Montrez comment éviter un pointeur dangling lors de l’utilisation de free
.
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int *)malloc(sizeof(int));
*p = 42;
printf("Valeur : %d\n", *p);
free(p);
p = NULL; // Réinitialiser le pointeur pour éviter un pointeur dangling
return 0;
}
NULL
.Protégez un tableau partagé entre plusieurs threads avec un mutex.
#include <stdio.h>
#include <pthread.h>
#define SIZE 5
int arr[SIZE] = {0};
pthread_mutex_t lock;
void *increment(void *arg) {
pthread_mutex_lock(&lock);
for (int i = 0; i < SIZE; i++) {
arr[i]++;
}
pthread_mutex_unlock(&lock);
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_mutex_init(&lock, NULL);
pthread_create(&t1, NULL, increment, NULL);
pthread_create(&t2, NULL, increment, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&lock);
for (int i = 0; i < SIZE; i++) {
printf("%d ", arr[i]);
}
return 0;
}
Cette suite d’exercices couvre des concepts encore plus avancés avec les pointeurs en C. Les exercices impliquent la gestion de structures imbriquées, les pointeurs void, les allocations complexes, et les erreurs intentionnelles pour apprendre à déboguer.
Créez une structure représentant un étudiant (nom, âge, note moyenne) et utilisez un pointeur pour accéder et modifier ses champs.
#include <stdio.h>
#include <string.h>
typedef struct {
char name[50];
int age;
float average;
} Student;
int main() {
Student s1;
Student *ptr = &s1;
// Modifier via pointeur
strcpy(ptr->name, "Alice");
ptr->age = 20;
ptr->average = 17.5;
// Afficher les valeurs
printf("Nom : %s\n", ptr->name);
printf("Âge : %d\n", ptr->age);
printf("Moyenne : %.2f\n", ptr->average);
return 0;
}
->
pour accéder aux membres d’une structure via un pointeur.Allouez dynamiquement un tableau de structures Student
pour gérer plusieurs étudiants.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[50];
int age;
float average;
} Student;
int main() {
int n = 3;
Student *students = (Student *)malloc(n * sizeof(Student));
if (students == NULL) {
printf("Erreur d'allocation mémoire\n");
return 1;
}
// Initialiser les données
for (int i = 0; i < n; i++) {
snprintf(students[i].name, 50, "Etudiant %d", i + 1);
students[i].age = 18 + i;
students[i].average = 15.0 + i;
}
// Afficher les données
for (int i = 0; i < n; i++) {
printf("Nom : %s, Âge : %d, Moyenne : %.2f\n",
students[i].name, students[i].age, students[i].average);
}
free(students);
return 0;
}
void
Utilisez un pointeur void
pour créer une fonction générique qui affiche différentes valeurs.
#include <stdio.h>
void printValue(void *ptr, char type) {
switch (type) {
case 'i': // Entier
printf("Valeur entière : %d\n", *(int *)ptr);
break;
case 'f': // Float
printf("Valeur flottante : %.2f\n", *(float *)ptr);
break;
case 'c': // Caractère
printf("Caractère : %c\n", *(char *)ptr);
break;
default:
printf("Type non reconnu\n");
}
}
int main() {
int a = 10;
float b = 3.14;
char c = 'A';
printValue(&a, 'i');
printValue(&b, 'f');
printValue(&c, 'c');
return 0;
}
void
permettent une flexibilité maximale, mais nécessitent un transtypage explicite.Implémentez une liste chaînée pour stocker des entiers.
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
// Ajouter un élément en tête
Node *addNode(Node *head, int value) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = value;
newNode->next = head;
return newNode;
}
// Afficher la liste
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
// Libérer la liste
void freeList(Node *head) {
Node *current = head;
while (current != NULL) {
Node *next = current->next;
free(current);
current = next;
}
}
int main() {
Node *head = NULL;
head = addNode(head, 10);
head = addNode(head, 20);
head = addNode(head, 30);
printList(head);
freeList(head);
return 0;
}
Créez une fonction générique pour trier un tableau en fonction de la taille des éléments.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sort(void *arr, size_t n, size_t size, int (*cmp)(const void *, const void *)) {
char *base = (char *)arr;
for (size_t i = 0; i < n - 1; i++) {
for (size_t j = i + 1; j < n; j++) {
if (cmp(base + i * size, base + j * size) > 0) {
char temp[size];
memcpy(temp, base + i * size, size);
memcpy(base + i * size, base + j * size, size);
memcpy(base + j * size, temp, size);
}
}
}
}
int compareInt(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main() {
int arr[] = {5, 2, 9, 1, 6};
size_t n = sizeof(arr) / sizeof(arr[0]);
sort(arr, n, sizeof(int), compareInt);
for (size_t i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
void *
avec des fonctions de comparaison pour généraliser les algorithmes.L’analyse de texte est une méthode utilisée pour comprendre et interpréter un texte de manière…
L'analyse sémantique est une méthode utilisée pour étudier et comprendre le sens des mots, des…
L’analyse sémantique est un processus qui consiste à étudier le sens des mots, des phrases,…
L’analyse littéraire est un exercice essentiel dans l’étude des textes littéraires. Elle permet de comprendre…
La fiche de présentation d’une association est un document essentiel qui permet de présenter de…
La mise en conformité réglementaire est devenue un impératif incontournable pour les entreprises évoluant dans…
This website uses cookies.