Révision Complète : Pointeurs, Structures, Chaînes et Allocation
Dynamique
1. Les Pointeurs
**Définition**
Un pointeur est une variable qui contient l'adresse mémoire d'une autre variable.
```c
int a = 5;
int* p = &a; // p pointe vers a
```
**Syntaxe de déclaration**
```c
<type> *NomPointeur;
```
Exemple :
```c
int *pNombre;
float *pFloat;
```
**Initialisation**
Toujours initialiser à `NULL` si non utilisé :
```c
int *p = NULL;
```
**Accès au contenu pointé**
- `*p` donne la valeur de la variable pointée.
- `&var` donne l'adresse de `var`.
**Exemple complet**
```c
int n = 10;
int* p = &n;
printf("%d", *p); // Affiche 10
*p = 20;
printf("%d", n); // Affiche 20
```
**Pointeurs et Tableaux**
Un tableau est un pointeur sur son premier élément :
```c
int tab[5] = {1,2,3,4,5};
int *p = tab;
```
**Arithmétique des pointeurs**
- `p++` : Avance au prochain élément.
- `p+n` : Avance de `n` éléments.
2. Structures et Tableaux de Structures
**Définition d'une Structure**
```c
struct Etudiant {
char nom[30];
int age;
float moyenne;
};
```
**Avec typedef**
```c
typedef struct {
char nom[30];
int age;
float moyenne;
} Etudiant;
```
**Accès aux champs**
- `[Link]` pour structure
- `p->age` pour pointeur sur structure
**Structures imbriquées**
```c
struct Date {int jour, mois, annee;};
struct Livre {char titre[50]; struct Date edition;};
```
**Tableaux de Structures**
```c
Etudiant classe[30];
classe[0].age = 22;
```
3. Chaines de Caractères
**Déclaration**
```c
char nom[20] = "Bonjour";
```
**Accès aux caractères**
```c
nom[0] = 'S'; // nom devient "Sonjour"
```
**Fonctions utiles**
- `strlen`, `strcpy`, `strcat`, `strcmp`
**Tableaux de chaines**
```c
char jours[7][10] = {"lundi", "mardi", ...};
printf("%s", jours[0]);
```
4. Allocation Dynamique
**Pourquoi?**
- Taille inconnue à la compilation
- Optimiser l'utilisation mémoire
**Fonctions**
- `malloc`, `calloc`, `realloc`, `free`
**Exemples**
```c
int *tab = (int *) malloc(5 * sizeof(int));
float *tab = (float *) calloc(10, sizeof(float));
tab = realloc(tab, 20 * sizeof(int));
free(tab);
```
Exercices pratiques
**Exercice 1**
Créer un pointeur sur int, stocker 30 et afficher.
```c
int n = 30;
int* p = &n;
printf("%d", *p);
```
**Exercice 2**
Créer un tableau dynamique de 10 flottants :
```c
float *tab = (float *) calloc(10, sizeof(float));
```
**Exercice 3**
Déclarer une structure Livre avec titre et année :
```c
typedef struct {char titre[50]; int annee;} Livre;
```
Mini-Quiz
1. Quel est l'intérêt d'un pointeur ?
2. Comment accéder au champ `age` d'une structure via pointeur ?
3. Quelle est la différence entre `malloc` et `calloc` ?
4. Que fait `free` ?
5. Comment concaténer deux chaînes en C ?
Astuces pour réussir l'examen
- Toujours initialiser tes pointeurs.
- Toujours libérer la mémoire allouée.
- Utiliser `typedef` pour simplifier.
- Tester NULL après une allocation.
- S'entraîner aux pointeurs + tableaux.