1 Pointeurs, références, alias et tableaux



Documents pareils
Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

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

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

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

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Chapitre 1 : La gestion dynamique de la mémoire

Conventions d écriture et outils de mise au point

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Le langage C. Séance n 4

Cours 1: Java et les objets

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

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

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

INITIATION A LA PROGRAMMATION

Généralités sur le Langage Java et éléments syntaxiques.

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

Claude Delannoy. 3 e édition C++

TP : Gestion d une image au format PGM

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

Cours d Algorithmique et de Langage C v 3.0

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

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

Cours de C. Allocation dynamique. Sébastien Paumier

Programmation système I Les entrées/sorties

Chap III : Les tableaux

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Programmation stochastique

Compression de Données - Algorithme de Huffman Document de Conception

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


I. Introduction aux fonctions : les fonctions standards

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

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

Manuel d'installation

et Programmation Objet

Programmation Orientée Objet Java

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

Introduction à la Programmation Parallèle: MPI

Programme Compte bancaire (code)

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

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

Logiciel de base. Première année ENSIMAG

Structurer ses données : les tableaux. Introduction à la programmation

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

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

Java Licence Professionnelle CISII,

INFO-F-105 Language de programmation I Séance VI

Les chaînes de caractères

Algorithmique, Structures de données et langage C

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

Utilisation d objets : String et ArrayList

Plan du cours Cours théoriques. 29 septembre 2014

Cours de C/C++ par la pratique. Hugues Talbot

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

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Introduction au langage C

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

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

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Les fichiers. Chapitre 4

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

Programmation impérative

Programmation système de commandes en C

Package Java.util Classe générique

Le prototype de la fonction main()

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

Programmer en JAVA. par Tama

Introduction à MATLAB R

Recherche dans un tableau

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Introduction à l héritage en C++

Arguments d un programme

LES TYPES DE DONNÉES DU LANGAGE PASCAL

TP, première séquence d exercices.

Cours Programmation Système

Chapitre 2. Classes et objets

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Les attaques par corruption de mémoire Synopsis Mickael Deloison 22/10/2008

Langage Java. Classe de première SI

Gestion de la mémoire

COMPARAISONDESLANGAGESC, C++, JAVA ET

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

as Architecture des Systèmes d Information

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

GESTION DES FICHIERS C/UNIX

Les structures. Chapitre 3

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Notions fondamentales du langage C# Version 1.0

Une introduction à Java

Introduction à JDBC. Accès aux bases de données en Java

Programmation en C/C++

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

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Transcription:

1 Pointeurs, références, alias et tableaux 1

1.1 Définitions Un pointeur est une variable contenant l'adresse d'un objet en mémoire. Un pointeur est déni par le couple (type, adresse) de l'objet pointé. déclaration : type *identificateur; exemple : p est un pointeur sur un entier, i.e. p contient l'adresse d'une case mémoire contenant un entier. int *p; Si p est un pointeur sur le type Type alors on accède à la valeur pointée par *p exemple float *p; *p=2.0; si x est une variable de type Type, alors &x est l'adresse de x, c'est donc un pointeur sur Type exemple float x; float *px; px = &x; si x est un float, alors float &xalias = x est une déclaration légale, xalias est un alias de x. exemple float x; float &y = x; // initialisation obligatoire 2

1.2 Pointeurs et tableaux en C++, pointeurs et tableaux sont très liés : int T[5] ; int *p ; Attention, l'indice d'un tableau à n élément varie de 0 à n-1 l'instruction p = T ; est autorisée car T est aussi un pointeur d'entiers ; équivaut à p = &T[0]; p pointe sur le premier élément de T p+i pointe sur le ième élément suivant; *(p+i) est égal à T[i]. Le nom d'un tableau est un pointeur constant sur le premier élément du tableau. Allocation dynamique d'un tableau de n éléments de type Type : Type *a; a = new Type[n]; delete[]a; //allocation memoire //liberation memoire si l'allocation réussit, new retourne un pointeur sur le premier élément de la mémoire allouée, sinon il retourne NULL. Le programmeur qui alloue de la mémoire dynamiquement a en charge la libération de mémoire qui n'est en aucun cas automatique au cours du déroulement du programme. 3

1.3 Chaînes de caractères une chaîne de caractères est un tableau de caractères Certaines fonctions sont disponibles. Ces fonctions sur chaînes de caractères sont déclarées dans <string.h>. Sous UNIX, une aide en ligne est disponible via la commande man string. La n d'une chaîne de caractère est signalée par un caractère NULL (ou '\0'), inséré par le compilateur. on accède aux constantes de type chaîne de caractères au moyen d'un pointeur de type char, pointant sur le premier élément de la chaîne, par exemple char *s; lors de l'instruction char * s=ceci est un message; la chaîne n'est pas recopiée dans s mais s contient l'adresse du premier élément de cette chaîne. Les fonctions les plus utiles : char *strcpy(char *dest, const char *src); recopie src dans dest (la place mémoire de dest doit avoir été réservée) char *strcat(char *dest, const char *src); recopie src à la n de dest (la place mémoire de dest doit avoir été réservée) size_t strlen(const char *s); retourne la taille de la chaîne s La classe string permet une manipulation plus intuitive et ecace des chaines de caractères. Par exemple : # include <iostream> # include <string> using namespace std; int main(void) { string S("Puiseux"); cout << endl << S +" Pierre"<< flush; return 0; } 4

1.4 Tableaux multidimensionels, matrices déclaration : type identificateur [dim1][dim2]; exemple : const int MAXDIM=100 ; long double a[maxdim][maxdim] ; les éléments sont rangés par lignes : a[i] est (l'adresse du premier élément de) la ligne numéro i *a[i] est le premier élément de la ligne numéro i. a[i]+j est l'adresse du jème élément de la ligne i a[i][j] est l'élément ième ligne, jème colonne *a[i]+j est l'élément ième ligne, jème colonne aussi Allocation dynamique d'une matrice de taille n*n : double **a; //allocation a = new (double *)[n]; for (i=0;i<n;i++) a[i] = new double[n]; //liberation for (i=0;i<n;i++) delete []a[i]; delete[]a; si l'allocation réussit, new retourne un pointeur sur le premier élément de la mémoire allouée, sinon il retourne NULL 5

T[i] T[i][j] 1.5 Remarques sur les pointeurs le C++ n'eectue pas de vérication sur les indices de tableau. C'est au programmeur de prendre ses précautions. a[i] est évalué par le C++ comme *(a+i) dans le cas de transmission de tableau en paramètre d'une fonction, seule l'adresse du premier élément est transmise. La valeur NULL (en fait 0) pour un pointeur est caractéristique d'un pointeur mal initialisé ou mal déclaré. L'incrémentation d'un pointeur p++ (ou p--) a pour eet d'incrémenter p de sizeof(p) octets. Int T[10][5][2]; est un tableau à 10 éléments, chaque élément étant une matrice à 5 lignes, 2 colonnes. désigne donc une matrice (deux dimensions) ; désigne un tableau à une dimension (ou vecteur) d'entiers ; T[i][j][k] désigne un entier. 6

1.6 Pointeurs de fonctions une fonction n'est pas une variable. Néanmoins, elle a une adresse en mémoire. On peut donc dénir une variable qui pointe sur une fonction. Déclaration : double (*f) (int,float); int (*g) (); f est un pointeur sur une fonction prenant un int et un float en arguments et dont le résultat est de type double. g est un pointeur sur une fonction sans arguments dont le résultat est de type int. A distinguer de double *f(); qui désigne une fonction renvoyant un pointeur sur double. Peut s'utiliser lorsque la fonction à utiliser peut varier, par exemple pour une méthode de Newton générique (1d), on dénira par exemple : double Newton(double(*f)(double);int itmax); { /*ici, on peut utiliser la fonction f comme on le désire*/ }; //appel : double solution ; double f(double x) ; solution = Newton(f,ITMAX); 7

1.7 Allocation dynamique de mémoire Opérateurs new et delete exemple : voir ([1.2] et [1.4]). A privilégier par rapport à la solution suivante (malloc). On peut trouver aussi des fonctions de la famille malloc (langage C): void *malloc(size_t size) ; aloue un bloc de mémoire de size octets dans la zone de mémoire appelée tas (heap). NB : l'instruction calloc(n,s) est équivalente à malloc(n*s). Si l'allocation réussit, malloc renvoie un pointeur sur le bloc nouvellement alloué. Si la place disponible est insusante ou si size vaut 0, malloc renvoie NULL. Le contenu du bloc n'est pas modié. Si l'argument size vaut 0, alors malloc renvoie NULL. exemple : allocation mémoire pour une matrice n*n (produit un résultat analogue à [1.2] et [1.4]): /*tableau de n pointeurs 0-->n-1 */ if ((a = (double * *) malloc (n*sizeof(double *))) == NULL) FatalWarning ("Memoire insuffisante \n"); for (i=0; i<n; i++) if ( (a[i] = (double *) malloc(n*sizeof(double)))== NULL) FatalWarning ("Memoire insuffisante \n"); /* Après utilisation, libérer la mémoire par free */ for (i=0; i<n; i++) free(a[i]); free(a); 8