aboutsummaryrefslogtreecommitdiff
path: root/semestre 2/informatique/7- Structure (ou enregistrement).md
blob: d06d8059a30849651d11abcedb9feddf6614ad7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
---
tags:
  - sorbonne
  - informatique
semestre: 2
---
Pour organiser les données, on utilise `struct`
```c
struct s_int_pair {
	int fst;
	int snd;
}; // vraiment utile le ; ?
```
Est toujours au début du fichier `.c` ou dans le `.h` si elle est utilisée par plusieurs fichiers
|> possède deux champs nommés `fst` et `snd`

Les fichiers headers (`.h`) spécifient les interfaces utilisables par l'extérieur du fichier C
|> contient les struct publics, les functions publiques...
|> ne contient pas tout ce qui est privé

Pour qu'une variable utilise un struct, on écrit
```c
struct s_int_pair point;
```
sauf que c'est long à écrire, donc on renomme tout ça avec un `typedef` :
```c
typedef struct s_int_pair int_pair;
int main(){
	int_pair point; 
	return 0;
}
```
on peut aussi tout définir d'un coup
```c
typedef struct s_int_pair{
	int fst;
	int snd;
} int_pair;
```

> [!NOTE] Nom de la structure et nom du type associé
> Souvent, on nomme `_ABC` le nom de la structure et `ABC` le nom du type associé
> |> permet d'avoir un nom similaire mais différent
> |> est une convention

Pour initialiser un struct, on utilise les parenthèses
```c
int_pair p = {1,2}; // initialisation séquentielle
int_pair p2 = {.snd=3, .fst=4}; // initialisation sélective
```
la première est traditionnelle et est commune

Pour modifier les valeurs dans un struct, on accède aux champs avec l'opérateur `.` :
```c
p.fst = -1;
p.snd = -2;

p = p2; // copie la structure p2 dans p
```

*voir le cours pour la représentation dans le stack*

Quand on définit une structure, on peut perdre de la mémoire, notamment si on utilise pas tout un octet

Structures et fonctions
|> on peut retourner des structures depuis des fonctions sans aucun problème (pas besoin de faire un `malloc`)
|> il n'y a pas d'effet de bord quand on utilise des structures dans une fonctions -> on a besoin d'utiliser un pointeur pour en réaliser un

Il n'existe pas d'arithmétique des structures

On peut chaîner les structures, i.e.
```c
struct _cell {
	int v;
	struct cell* next;
}
```
(ce qui donne une liste chaînée)

L'opérateur `->` est un raccourcie permettant le déférencement rapide
```c
Foo *foo;

foo->bar = 10;
// est équivalent à
(*foo).bar = 10;

foo->baz();
// est équivalent à
(*foo).baz();
```