Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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
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
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
Exercice
Écrire une fonctions swap qui inverse la valeur de deux entiers
Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 12 / 26
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
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
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
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
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
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
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
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
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
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
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
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
Gestion de la mémoire
Fonctionsmemmove (note : ne pas utiliser memcpy)strdup
Jean Privat (UQAM) 03 — Tableaux et pointeurs INF7330 — Automne 2012 25 / 26
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