26
Chapitre 3 Tableaux et pointeurs Jean Privat Université du Québec à Montréal INF7330 — Construction de logiciels Diplôme d’études supérieures spécialisées en systèmes embarqués Automne 2012 Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 1 / 26

Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Chapitre 3Tableaux et pointeurs

Jean Privat

Université du Québec à Montréal

INF7330 — Construction de logicielsDiplôme d’études supérieures spécialisées en systèmes embarqués

Automne 2012

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 1 / 26

Page 2: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Tableaux

Types construitsRegroupe des valeurs du même type

Déclaration/* t est un tableau de 5 entiers */int t[5] ;/* u est un tableau de 2 doubles */double u[2] = {0.1, 0.2} ;

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 2 / 26

Page 3: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Accès aux éléments

Syntaxex = t[1] + 1 ;

t[0] = 5 ;

AttentionLes tableaux commencent à 0Pas de vérification des bornesLa taille n’est pas dans le tableauUn tableau n’est pas automatiquement redimensionnéUn accès à un tableau est une left-value

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 3 / 26

Page 4: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Affecter des tableaux

Pas possible directementItérer pour affecter les éléments un à unUtiliser des fonctions comme memmove pour copier des zonesmémoiresEncapsuler le tableau dans une structure ou une union

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 4 / 26

Page 5: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Paramètres de fonction de type tableau

Sémantique non naturellePassage par référenceLa taille n’importe pas (conseil, ne pas mettre de taille)La taille est passée en général en plus via un autre paramètre

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 5 / 26

Page 6: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Exercice

Écrire une fonction qui indique si un tableau d’entiers est triéÉcrire une fonction qui trie un tableau d’entiers

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 6 / 26

Page 7: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Retour de fonction de type tableau

Pas possible directementRetourner des pointeurs vers des tableauxEncapsuler le tableau dans un structure ou une union

AttentionSe méfier alors des tableaux alloués dans la pile

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 7 / 26

Page 8: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Pointeur

Désigne une adresseL’emplacement mémoire d’une donnéeLe type du pointeur permet d’interpréter la donnée

AttentionNe pas confondre le pointeur avec la donnée pointée

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 8 / 26

Page 9: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Pointeur

IntérêtPermet de manipuler des informations par référence

AttentionPas de protectionFaites des dessins pour comprendre

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 9 / 26

Page 10: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Type pointeur

Syntaxe de basetype *nom ;

AttentionColler l’* au nom, pas au typeint *a, b ; /* sur a est un pointeur. */

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 10 / 26

Page 11: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Opérateurs de (dé)référencement

2 opérateurs& référence une left-value∗ déréférence une valeur de type pointeurUn déréférencement est une left-valueUn référencement n’est pas une left-value

Exempleint i = 5, *p ;p = &i ;*p = 6 ;printf("%d\n", i) ;

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 11 / 26

Page 12: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Exercice

Écrire une fonctions swap qui inverse la valeur de deux entiers

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 12 / 26

Page 13: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Pointeur void

Le type universelPointe des octets (arithmétique d’adresse vrai)Compatible avec tous les autres pointeurs vers de valeurs

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 13 / 26

Page 14: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Pointeur NULL

L’absence de chose pointéeNULL désigne un pointeur vers nulle partDéréférencer NULL a un comportement indéterminé

UtilisationValeur non initialisée/non présente/non souhaitéeMarqueur de fin

AttentionToujours penser au cas ou un pointeur est NULL

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 14 / 26

Page 15: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Tableau et pointeurs

PrincipeEn C les tableaux et pointeurs sont très analogues

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 15 / 26

Page 16: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Arithmétique des pointeurs

Les pointeurs sont typésOn sait vers quoi ils pointentOn sait dont la taille de vert quoi ils pointentRègle : toute opérations sur les pointeurs prennent en compte letype des choses pointés

Règleadressede(pointeur + nombre) est(adressedepointeur) + nombre ∗ sizeof (∗pointeur)

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 16 / 26

Page 17: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Tableaux analogues aux pointeurs

Expression de type tableauUtilisé en tant qu’expression, un tableau est comme un pointeurvers le premier élémentDéréférencer un tableaux c’est également avoir l’adresse dupremier élément.

Opérateur crochetEn réalitéx[y]signifie*(x + y)Fonctionne pour les vrais pointeurs et les tableaux

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 17 / 26

Page 18: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Exerciceint t1[5] = {10, 20, 30, 40, 50} ;int *t2 = t1 ;int **t3 = &t2 ;int *t4[2] = { t2, NULL } ;int (*t5)[5] = &t1 ;printf("%p %ld\n", t1, sizeof(t1)) ;printf("%p %ld\n", &t1, sizeof(&t1)) ;printf("%d %ld\n", t1[0], sizeof(t1[0])) ;printf("%p %ld\n", t2, sizeof(t2)) ;printf("%d %ld\n", t2[0], sizeof(t2[0])) ;printf("%p %ld\n", t3, sizeof(t3)) ;printf("%p %ld\n", t3[0], sizeof(t3[0])) ;printf("%p %ld\n", t4, sizeof(t4)) ;printf("%p %ld\n", t4[0], sizeof(t4[0])) ;printf("%p %ld\n", t5, sizeof(t5)) ;printf("%p %ld\n", t5[0], sizeof(t5[0])) ;

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 18 / 26

Page 19: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Pointeurs constants

Mot clé const protègeconst int *a ;int const *b ;int *const c ;

a et b : a est modifiable mais ∗a ne l’est pasc : c n’est pas modifiable mais ∗c l’est

AttentionProtection non sure : il est possible de court-circuiterLes tableaux sont toujours constant (mais pas forcément leurcontenu)

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 19 / 26

Page 20: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Chaînes de caractères

NatureUne séquence de caractères terminée par le caractère NUL (codeASCII 0, noté ’\0’)

TypesOn utilise char∗ ou char[]

AttentionNe pas confondre NULL et NUL

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 20 / 26

Page 21: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Signature de main

int main(int argc, char *argv[])

argcle nombre d’arguments + 1

argvle nom du programmepuis, chacun des argumentspuis NULL

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 21 / 26

Page 22: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Manipulation des chaînes de caractères

Fonctions pratiquesstrlen : taille d’une chainestrcmp : compare deux chainesstrcpy et strncpy : copier des chaînesstrcat et strncat : concaténer des chaînesstrstr et strchr : chercher dans une chaîne

AttentionLes chaînes sont des tableaux/pointeurs, il faut vivre avecPenser à l’espace pour le NUL finalAttention débordement (toujours utiliser les fonction “n”)

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 22 / 26

Page 23: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Exercices

Écrire un programme qui affiche chacun des argumentsÉcrire un programme qui affiche les arguments triéslexicographiquement

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 23 / 26

Page 24: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Allocation et désallocationBesoin de mémoire

On veut pouvoir allouer librement de la mémoire

PrincipeL’allocation nous retourne un pointeurIl faut libérer la mémoire après utilisation (sinon fuite mémoire)Encore une fois, aucune vérification et de nombreuxcomportement non déterminésUtiliser sizeof pour savoir combien allouer

Fonctionsmalloc alloue une zone mémoire non initialisé (memory alloc)calloc alloue une zone mémoire initialisé à 0 (clear-alloc)free libère une zone mémoire

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 24 / 26

Page 25: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Gestion de la mémoire

Fonctionsmemmove (note : ne pas utiliser memcpy)strdup

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 25 / 26

Page 26: Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3 Tableaux et pointeurs Author: Jean Privat Created Date: 10/24/2012 4:07:03 PM

Exercices

Écrire une fonction qui transforme une chaîneles «<» sont remplacés par des «&lt ;»les «&» sont remplacés par des «&amp ;»

ContraintesLa chaîne originale n’est pas modifiéeUne nouvelle chaîne est allouée et est retournéeSeule la quantité exacte de mémoire est allouée

Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 26 / 26