IFT 1969 A+B , hiver 2005 :
A) Introduction aux adresses et aux pointeurs :
En programmation, on utilise très souvent les caractéristiques suivants d'une variable :
1. son nom (identificateur) 2. son contenu (sa valeur)
3. son type (entier, réel, caractère, ...)
Grâce au type de la variable, le compilateur connaît le nombre d'octets (byte) pour mémoriser une telle variable. Le C dispose d'un opérateur nommé "sizeof" pour cet effet :
sizeof(char) vaut 1, signifie qu'on utilise 1 octet pour mémoriser un caractère
sizeof(float) vaut 4, signifie qu'on utilise 4 octets pour mémoriser un réel
etc ....
Si a est une variable de type "int", sizeof(a) est équivalent à sizeof(int) :
sizeof (un type) <==> sizeof(une variable du type)
1) Les adresses :
En C, on ajoute un caractéristique de plus à une variable : son adresse (son emplacement en mémoire) déterminée par l'opérateur & (adresse de)
L'adresse d'une variable est déterminée souvent à la compilation de la manière séquentielle :
Exemple d'illustration des adresses :
Soit le programme suivant :
/* Fichier : Infos.c (informations en C) Par Le Van N., pour IFT 1969 A+B
*/
#include <stdio.h>
void main() {
int population = 1200000000, /* population en nombre d'habitants */
nbCafe = 3; /* nb de tasses de café consommé par jour */
short age = 23; /* 23 ans : short int (entier de petites valeurs) */
double taille = 1.72 ; /* 1.72 mètre */
printf("Identificateur Type Valeur Octets Adresse\n");
printf("--- ---- --- --- ---\n");
printf("population int %12d %5d %10u\n", population, sizeof(int),&population);
printf("nbCafe int %12d %5d %10u\n", nbCafe, sizeof(nbCafe),&nbCafe);
printf("age short %12d %5d %10u\n", age,sizeof(age),&age);
printf("taille double %12.2f %5d %10u\n", taille, sizeof(double),&taille);
}
/* Exécution:
Identificateur Type Valeur Octets Adresse --- ---- --- --- --- population int 1200000000 4 1245052 nbCafe int 3 4 1245048 age short 23 2 1245044 taille double 1.72 8 1245036 Press any key to continue
*/
2) Les pointeurs :
La valeur d'une variable entière est un entier : int age = 23 ; La valeur d'une variable de type réel est un réel :
float poids = 62.0 ;
La valeur d'un pointeur est une adresse.
int * p1; => p1 est un pointeur vers une information de type int float * p2; => p2 est un pointeur vers une information de type float
Avec int age = 23;
float taille = 1.67;
Les affectations suivantes sont valides : p1 = &age;
p2 = &taille;
On dit alors que p1 pointe vers age et p2 pointe vers taille.
*p1 = 21; implique que age vaut aussi 21.