• Aucun résultat trouvé

IFT 1969 A+B , hiver 2005 : A) Introduction aux adresses et aux pointeurs :

N/A
N/A
Protected

Academic year: 2022

Partager "IFT 1969 A+B , hiver 2005 : A) Introduction aux adresses et aux pointeurs :"

Copied!
1
0
0

Texte intégral

(1)

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>

(2)

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.

(3)

*p1 = 21; implique que age vaut aussi 21.

B) Pour comprendre l’idée pratique d’un pointeur :

Vous êtes en train de regarder le RDI (réseau des informations) au poste 19 :

et vous souhaitez de changer au poste 33 pour le RDS (réseau des sports).

Devrait-on quitter le salon, aller au téléviseur et changer manuellement pour

obtenir le poste 33 ?

(4)

- Non! Il suffit d’utiliser une télé commande : le numéro composé sur la télé- commande sera celui sur le téléviseur.

C’est pareil en langage C : changer *p dans une fonction (comme

changer au poste 33 sur la télé-commande) permet de changer la

(5)

/* Fichier parapointeur.c (paramètre transmis par pointeur)

La transmission d'un résultat via pointeur peut comparer au changement d'un poste d'une télévision par télécommande télécommande : composer le nouveau poste

téléviseur : on est sur ce nouveau poste En C :

Dans une fonction : changer *p

Après l’appel de la fonction : la valeur de la variable pointée est changée aussi.

*/

#include <stdio.h>

void changer(int * p) {

*p = 33; /* changer en RDS : réseau des sports */

} void main() {

int poste = 19; /* RDI : réseau des informations */

printf("On est en train de regarder RDI au poste %d\n", poste);

changer(&poste);

printf("On regarde maintenant le RDS au poste : %d\n", poste);

}

/* Exécution:

On est en train de regarder RDI au poste 19 On regarde maintenant le RDS au poste : 33 Press any key to continue

*/

(6)

C) Conseils pour écriture des fonctions qui transmettent des résultats via pointeurs :

À l’appel :

calculer( …., …., &resultat1, &resultat2, . . .);

La fonction à écrire :

void calculer( …., …., type1 * p1, type2 * p2, . . .) {

. . .

*p1 = le premier résultat ; *p2 = le deuxième résultat;

}

À l’appel, on envoie l’adresse d’un résultat à calculer.

Sur l’en-tête de la fonction, un pointeur qui pointe vers le type du résultat.

Dans le corps de la fonction *p représente le résultat.

En classe et durant les périodes de révision, on présente

plusieurs exemples qui illustrent cette technique de

transmission des paramètres par pointeurs.

Références

Documents relatifs

Ce courant crée lui-même un champ magnétique induit, détecté via la f.é.m qui apparaît dans la bobine du détecteur.. Boucle magnétique de feux rouges ou de

Celle qui correspond à la dépense minimale est la droite parallèles à d 5 qui a une ordonnée à l'origine minimale tout en ayant au moins un point dans l'ensemble des

[r]

Ce cours a pour objectif d’approfondir les connaissances de HTML des participants et de les familiariser avec la création de sites dynamiques et

On crée aussi un nouveau fichier nommé &#34;patinart.res&#34; dont chaque ligne contient les 9 notes et la note finale d’un patineur. Critères de correction du numéro 1 (total de

[r]

Dans le choix, l'évaluation et l'utilisation d'un ensemble de stratégies, il faut distinguer plusieurs étapes, â chacune desquelles peuvent intervenir différents ensembles

[r]