François Trahay
* On peut faire référence à n’importe quel octet de l’espace mémoire
grace à son adresse * Adresse mémoire virtuelle codée sur k bits1 * donc 2k octets accessibles (de
00...00
à 11...11
)
0x1001
est stocké l’octet
0x41
char
(le caractère
A
)int
(par exemple
l’entier 0x11**41**2233
)1 k dépend de l’architecture. Sur les processeurs modernes (64 bits), on a k = 64.
&var
désigne l’adresse de var
en
mémoire%p
dans printf
: printf("adresse de var: %p\n", &var);
affiche:
adresse de var: 0x7ffe8d0cbc7f
type* nom_variable;
type
désigne le type de la donnée “pointée”char* pa;
crée un pointeur sur une donnée de
type char
:* ptr
exemple:
Si un tableau est un argument de fonction
void f(int x[])
<=>
void f(int* x)
tab[i]
réécrit en *(tab + i)
tab = 0x1000
et i=5
tab[i]
calcule
0x1000 + (5*sizeof(int)) = 0x1000 + 0x14 = 0x1014
sizeof(tab)
donne la taille d’un pointeur&tab
donne l’adresse de
int[] tab
, donc &tab != tab
Si un tableau est une variable locale ou globale
int tab[3]; // alloue 3 int
tab
est le nom de cet espace mémoireint tab[] = { 1, 2, 3 }; // idem + initialisation
int tab[]; // interdit !
sizeof(tab)
renvoie la taille du tableauSi un tableau est une variable locale ou globale (suite)
&tab
donne l’adresse du tableau
&tab == &tab[0]
car tab
et tab[0]
désignent les mêmes emplacements mémoirestab
est implicitement transtypé vers son
pointeur au besoinint* tab2 = tab;
réécrit en
int* tab2 = &tab
if(tab == &tab)
récrit en
if(&tab == &tab)
f(tab)
réécrit en f(&tab)
printf("%p %p\n", tab, &tab);
réécrit en
printf("%p %p\n", &tab, &tab);
tab[i]
réécrit en (&tab)[i]
puis en
*(&tab + i)
*(tab + i)
réécrit en *(&tab + i)
Rappel:
void* malloc(size_t nb_bytes);
nb_bytes
octets et retourne un pointeur sur la
zone allouéechar* str = malloc(sizeof(char)* 128);
NULL
en cas d’erreur (par ex: plus assez de
mémoire)Attention ! Risque de “fuite mémoire” si la mémoire allouée n’est jamais libérée
void free(void* ptr);
malloc
est situé à l’adresse
ptr
&var
)type
: type* ptr;
ptr++
)NULL
*ptr
ptr->champ
ptr[i]
int* ptr = malloc(sizeof(int)*5);
* désallocation:
free(ptr);