Les structures de données
Les structures de données décrivent la manière dont on peux agencer et gérer la mémoire d'un ordinateur pour réprésenter et stocker des données sous un certains format.
Les variables
La mémoire d'un ordinateur peux se représenter conceptuellement comme une longue chaîne de case capable de contenir des informations. La taille d'une case mémoire est un mot et elle varie généralement en multiple de 8. Une taille de 8 bits représente donc 1 Octet, et un Octet est donc capable de contenir 28 informations différentes, par exemple les nombres de 0 à 255.
En agglutinant plusieurs mots, on peux alors augmenter l'espace de représentation et contenir par exemple 232 information. Ce faisant il est alors possible de stocker des nombres entiers, des caractères, des nombres à virgules, ou toute autre information encodé sous forme binaire.
Pour stocker ces informations de nature différentes sous un format binaire, les languages informatiques les classent dans des types de données, par exemple en C :
- char : qui peux contenir un caractère (existe en signé et non signé)
- short : qui contient un petit nombre entier classiquement sur 2 octets
- int : qui contient un nombre entier sur 2 ou 4 Octets
- float : qui contient un nombre à virgule sur 4 Octets
- double : qui peut contenir un nombre à virgule sur 8 Octets
Les variables sont déclarées puis initialisées et elles peuvent avoir plusieurs natures, en langage C par exemple elle peuvent être classée selon leur lieu de définition en variable globales, locales, statiques, automatiques et registres.
Les pointeurs
Les pointeurs peuvent se représenter mentalement comme une variables qui stocke une addresse mémoire. Cette addresse mémoire peut être l'addresse mémoire d'une autre variables, de l'entrée d'une fonctions, d'un autre pointeurs, d'une structures de données quelconque.
Ils sont très visibles en langage C mais se retrouvent partout, et permettent de comprendre par exemple pourquoi lorsque l'on passe un entier en paramètre d'une fonction, ce dernier n'est pas modifié en sortie de la fonction même si la fonction execute des instructions qui en modifie la valeur. Et qu'en revanche en python si l'on passe une liste à une fonction et que la fonction modifie un des éléments de la liste, cette liste se trouve modifiée même une fois sortie de la fonction.
Ainsi qu'on peut le vérifier en executant ces script python3 :
Ici la variable "a" même après être transmise à la fonction "displayDouble" où sa valeur est modifié pour prendre son double, une fois ressortie de la fonction la valeur de "a" vaut toujours 42.
a = 42
def displayDouble(number:int):
a = a*2
print(a)
print(a) # => 42
displayDouble(a) # => 84
print(a) # => 42
On dit que le variable est passée en copié, en réalité la fonction n'a récupéré qu'une copie de la valeur de "a". Modifier la valeur à l'intérieur de la fonction est transparent pour "a".
En revanche si on lui transmet une liste avec une valeur à l'intérieur, on peux constater que la valeur modifiée reste modifiée même une fonction sortie de la fonction :
a = [42]
def displayDouble(number:list):
a[0] = a[0]*2
print(a)
print(a) # => [42]
displayDouble(a) # => [84]
print(a) # => [84]
On dit que la valeur est passé par adresse, en réalité la fonction ne reçoit pas la liste en paramètre, mais l'addresse mémoire du début de la liste.
Lorsque la fonction altère le premier élément de la liste, cet élément reste altéré même après être sortie de la fonction. En fait la le paramètre de liste est un pointeur vers l'addresse de cette liste.