François Trahay
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
: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
:// pour l'exemple, les adresses sont codees sur 32 bits
char a = 'A'; // a est stocke a l'adresse 0x0000FFFF
// la valeur de a est 0x41 ('A')
char* pa = &a; // pa est une variable de 32 bits stockee
// aux adresses 0xFFFB a 0xFFFE
// la valeur de pa est 0x0000FFFF (l'adresse de a)
* ptr
exemple:
Un pointeur doit être systématiquement initialisé au moment de sa définition
fopen
étudié au
CI5)Un free sur un pointeur doit être systématiquement suivi d’une mise à
NULL
de ce pointeur.
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);
free(ptr);