1 Les pointeurs et quelques rappels sur certains éléments du langage C.
Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3...
Transcript of Chapitre 3 Tableaux et pointeurs - UQAMprivat/INF7330/03-tableaux.pdf · 2017-03-20 · Chapitre 3...
![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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/1.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/2.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/3.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/4.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/5.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/6.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/7.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/8.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/9.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/10.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/11.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/12.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/13.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/14.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/15.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/16.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/17.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/18.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/19.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/20.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/21.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/22.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/23.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/24.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/25.jpg)
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 ...](https://reader033.fdocument.pub/reader033/viewer/2022060300/5f0822917e708231d420832f/html5/thumbnails/26.jpg)
Exercices
Écrire une fonction qui transforme une chaîneles «<» sont remplacés par des «< ;»les «&» sont remplacés par des «& ;»
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