TP 8 : Les pointeurs

Documents pareils
Chap III : Les tableaux

Bases de programmation. Cours 5. Structurer les données

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Rappels Entrées -Sorties

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51


Cours d initiation à la programmation en C++ Johann Cuenin

Les structures. Chapitre 3

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Le langage C. Séance n 4

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Les structures de données. Rajae El Ouazzani

Programmation système I Les entrées/sorties

Chapitre 1 : La gestion dynamique de la mémoire

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Les chaînes de caractères

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

UE C avancé cours 1: introduction et révisions

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Algorithmique, Structures de données et langage C

Introduction au langage C

Algorithmique et Programmation, IMA

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP : Gestion d une image au format PGM

UE Programmation Impérative Licence 2ème Année

Plan du cours. Historique du langage Nouveautés de Java 7

TD3: tableaux avancées, première classe et chaînes

Architecture des ordinateurs

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Les processus légers : threads. Système L3, /31

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Java Licence Professionnelle CISII,

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Initiation. àl algorithmique et à la programmation. en C

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Programmation en langage C

Programmation impérative

Outils pour la pratique

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Logiciel de base. Première année ENSIMAG

Claude Delannoy. 3 e édition C++

Programmation Classique en langage C

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

as Architecture des Systèmes d Information

Travaux Dirigés n 1 : chaînes de caractères

Les fichiers. Chapitre 4

Le prototype de la fonction main()

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Le Langage C Licence Professionnelle Qualité Logiciel Pr. Mouad BEN MAMOUN ben_mamoun@fsr.ac.ma Année universitaire 2011/2012

1.6- Génération de nombres aléatoires

SUPPORT DE COURS. Langage C

Cours d Algorithmique et de Langage C v 3.0

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Représentation d un entier en base b

Cours 1 : Qu est-ce que la programmation?

I. Introduction aux fonctions : les fonctions standards

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Cours de Programmation Impérative: Zones de mémoires et pointeurs

V- Manipulations de nombres en binaire

Les arbres binaires de recherche

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Cours 1 : La compilation

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Analyse de sécurité de logiciels système par typage statique

Cours 1: Java et les objets

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

TP3 : Manipulation et implantation de systèmes de fichiers 1

Programmation assembleur : aperçu

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation C. Apprendre à développer des programmes simples dans le langage C

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Utilisation d objets : String et ArrayList

Programmation C. J.-F. Lalande. 15 novembre 2012

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Structure fonctionnelle d un SGBD

Programmation Structurée en Langage C

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

La mémoire. Un ordinateur. L'octet. Le bit

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Représentation des Nombres

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Conventions d écriture et outils de mise au point

COMPARAISONDESLANGAGESC, C++, JAVA ET

Programmation C++ (débutant)/instructions for, while et do...while

ALGORITHMIQUE ET PROGRAMMATION En C

Cours de Système : Gestion de Fichiers

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Support de Cours de Langage C. Christian Bac

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

1 Recherche en table par balayage

Transcription:

TP 8 : Les pointeurs Objectif : Maîtriser les notions d adresse et de pointeur LES POINTEURS... 2 1. RAPPEL SUR LES TABLEAUX...2 2. ADRESSES ET POINTEURS...2 3. RECUPERATION DE L ADRESSE D UN ELEMENT...3 4. ARITHMETIQUE DES POINTEURS...4 EXERCICES... 5 EXERCICE 1 : MANIPULATION DES POINTEURS...5 EXERCICE 2 : PASSAGE DE PARAMETRES PAR ADRESSE...6 EXERCICE 3 : PROBLEME DU DRAPEAU HOLLANDAIS...7 Stéphanie CHOLLET Ioannis PARISSIS 2014/2015

Les pointeurs 1. Rappel sur les tableaux La déclaration d un tableau est faite ainsi : TYPE nomtableau[n] Où : TYPE représente le type des données contenues dans le tableau ; nomtableau est le nom du tableau ; n est le nombre d éléments du tableau. Cette déclaration de tableau correspond à : 1. la réservation en mémoire d une zone de n (taille du TYPE) octets contigus pour le tableau ; 2. deux informations supplémentaires : a. l adresse du premier octet de la zone réservée ; b. le type de l objet. Ces informations sons constantes : il n est pas possible d en modifier leurs valeurs (adresse et type). La déclaration suivante : float precipitations[12] ; correspond à : 2. Adresses et pointeurs Chaque variable d un programme C possède une adresse. Une adresse est un entier correspondant à l emplacement du premier octet de la mémoire occupée par cette variable. Un pointeur est une variable contenant une adresse d une variable d un type donné. Supposons que E soit un tableau d étudiants, T un tableau d entiers, i un pointeur vers un étudiant et j un pointeur vers un entier. Les déclarations de ces variables se fait ainsi : ETUDIANT E[50], *i ; int T[10], *j ; CS 313-CS 314 : Mise à niveau en C 2

i est un pointeur vers un objet de type ETUDIANT (on suppose que ce type a été défini par ailleurs) ; il est donc susceptible de contenir l adresse d un objet de type ETUDIANT. j est un pointeur vers un objet de type entier (i.e. est susceptible de contenir l adresse d un emplacement mémoire occupé par un entier ; on dit que j «pointe vers un entier»). Les affectations suivantes ont du sens : i E : affecte le contenu de E à i (E et i ont le même type) ; j T : affecte le contenu de T à j (T et j ont le même type). Les affectations suivantes n ont pas de sens : i T : impossible car T et i n ont pas le même type (le type d un pointeur est constant) ; E i : impossible car E est constant et ne peut être changé. 3. Récupération de l adresse d un élément En langage C, il existe une fonction prédéfinie qui, étant donné un objet, rend l adresse de cet objet. Cette fonction s appelle : &. L opérateur * permet de manipuler un objet pointé. Si k est un pointeur vers un entier, l expression *k désigne l entier pointé. Un pointeur (de n importe quel type) contenant la valeur NULL par convention «ne pointe sur rien» (aucune adresse ne lui est associée). Soient x un entier et p un pointeur sur un entier. Ils sont déclarés et initialisés ainsi : int x, *p ; x = 5 ; Figure 1 : Etat après la déclaration et l affectation. CS 313-CS 314 : Mise à niveau en C 3

L opération p &x affecte l adresse de x à p. Après cette opération, *p aura pour valeur 5. Figure 2 : Résultat de l'affection p &x. int *k, l ; /* k est un pointeur, l est un entier : attention à cette manière de déclarer! */ l = 5 ; k = &l ; printf( %d\n, l) ; *k = 2; printf( %d\n, l); Le code ci-dessus affichera successivement les valeurs 5 et 2. 4. Arithmétique des pointeurs Lorsque l on déclare un tableau T, on définit en fait un doublet constant (adresse, type). La notation T[n], où n est un entier, désigne alors l objet se trouvant à l adresse : adresse du doublet + n taille du type de T. Si i est un pointeur (adresse, type) et n un entier, alors la notation i + n désigne le doublet : (adresse du doublet + n taille du type, type) Les expressions *(i+n) et i[n] désignent le même objet. Pour un tableau E de 50 étudiants, E[4] désigne l objet de type étudiant qui se trouve à l adresse E + 4. Supposons que le tableau est stocké en mémoire à l adresse 10500 et que la taille d un objet de type Etudiant soit de 160. E = (10500, Etudiant) E + 4 = (11140, Etudiant) L expression *(E + 4) désigne également l étudiant se trouvant à l adresse 11140. Les deux expressions *(E + 4) et E[4] sont équivalentes. Soient les déclarations et les opérations suivantes : Etudiant E[50], *i, *j ; i = E ; j = i + 4 ; CS 313-CS 314 : Mise à niveau en C 4

Les expressions suivantes désignent toutes le même objet : E[4], i[4], *j, *(E + 4) et *(i + 4) Les expressions suivantes désignent toutes un autre même objet : E[5], (i+1)[4], *(i + 5), *(j + 1), j[1] et (j 2)[3] Exercices Exercice 1 : Manipulation des pointeurs Soient trois entiers a, b et c et deux pointeurs de type entier p1 et p2. 1. Déterminez quelle est la valeur des différents éléments donnés dans le tableau pour chaque opération. Initialisation p1 = &a p2 = &c *p1 = *p2 (*p2)++ p1 = p2 p2 = &b *p2 = *p1 2 * *p2 (*p2)-- *p1 = *p2 - c a = (2 + *p2) * *p1 a b c &a &b &c p1 p2 *p1 *p2 CS 313-CS 314 : Mise à niveau en C 5

a b c &a &b &c p1 p2 *p1 *p2 p2 = &c *p2 = *p1 / *p2 *p1 = a + b a += *p1 b = *p1 + *p2 *p1 = 2 * a a = *p2 *p2 = *p1 - *p2 *p1 = 1 c *p2 += *p1 + a p2 = p1 = &a p2++ p1 += 2 c = p2 == &c p1 = NULL 2. Vérifiez que vos réponses sont correctes à partir du fichier mainpointeur.c et du débogueur. Exercice 2 : Passage de paramètres par adresse En C, seul le passage de paramètres par valeur est disponible. Le passage de paramètres résultats (i.e. paramètres dont la valeur est modifiée par une fonction) n est pas supporté. Le seul moyen dont on dispose pour approcher ce mode de passage est d utiliser comme paramètre effectif une adresse. void incr(int *a) { *a = (*a)++ ; } int main() { int x = 5; incr(&x); printf("%d", x); /* ce programme affiche 6 */ return 0 ; } Observer l exécution de ce programme avec le débogueur. Qu en est-il de la fonction scanf? CS 313-CS 314 : Mise à niveau en C 6

Exercice 3 : Problème du drapeau hollandais On veut trier un tableau dont les éléments ne prennent que dix valeurs (de 0 à 9) avec le critère suivant : tous les éléments dont la valeur est strictement inférieure à 3 sont au début du tableau ; tous les éléments dont la valeur est comprise entre 3 et 6 sont au milieu ; et tous les éléments dont la valeur est strictement supérieure à 6 sont à la fin. Le programme affichera, par exemple : Tableau initial : 5 8 1 4 3 9 2 7 3 8 1 4 5 3 8 Tableau trié : 1 2 1 3 4 4 5 3 3 5 9 7 8 8 8 Voici le pseudo-algorithme pour ce tri : Début i1 = 0 ; i2 = N ; i3 = N ; Tant que (i1 <= i2) Faire En fonction de la valeur de T[i1] Cas au début : i1 = i1 + 1 Cas du milieu : Echange de T[i1] avec T[i2] i2 = i2 1 Cas de la fin Echange de T[i1] avec T[i3] Echange de T[i1] avec T[i2] i2 = i2 1 i3 = i3-1 FinTantQue Fin Ecrire le programme qui permet de trier un tableau suivant l algorithme proposé en utilisant les pointeurs. CS 313-CS 314 : Mise à niveau en C 7