Académique Documents
Professionnel Documents
Culture Documents
com
1. Pointeur à pointeur
2. Structures de données
3. Structure des données de la liste chaînée
4. Pointeur de fonction
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
Aperçu KE 8 2
Cours d'ingénieur informatique – 2 crédits SWS/2 : EI1, EI+1, MKA1, MK+1, EI3nat3
Cours de programmation 2 (Partie C) – 2 crédits SWS/2 : AI2
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
1
1. Pointeur à pointeur 3
principe
Le pointeur à pointeur est un sujet assez complexe. Les principaux domaines d'application sont :
• Déplacer un pointeur dans une fonction
• Création dynamique de tableaux multidimensionnels
piVal = &iVal;
ppiVal = πVal ;
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
1. Pointeur à pointeur 4
vidage mémoire
piVal = &iVal;
ppiVal = πVal ;
printf("iVal : Adresse : %08p Valeur : %08X\n", &iVal, Valeur :
iVal);
printf("piVal : Adresse : %08p piVal);
%08X\n", &piVal, Valeur : %08X\n",
printf("ppiVal : Adresse : %08p ppiVal, ppiVal);
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
2
1. Pointeur à pointeur 5
annulerIncrementCharPointer1(carboniser*pc) { annulerIncrementCharPointer2(carboniser**ppc) {
pc++ ; (*ppc)++ ;
} }
Le pcArray d'origine n'est pas modifié Le pcArray d'origine est modifié
1. Pointeur à pointeur 6
Solution 1 :
carboniseraacA[4][100] ; Inflexible et trop de mémoire allouée statiquement.
carboniser*
5 0x44 ... 0x00
carboniser*
4 0x340x320x00
carboniser*
3 0x480x650x6C0x6C0x6F 0x200x570x6F 0x720x6C0x640x00
1 carboniser*
2 0x450x490x00
caractère**ppcA
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
3
1. Pointeur à pointeur 7
si(ppcA !=ZÉRO) {
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
Structure de données = type de données complexe + fonctions pour ce type de données complexe
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
4
2. Structures de données 9
déployer
piles File d'attente (FIFO)
dynamique (LIFO)
tableaux
liste = tableau ?
Une liste a deux contre un tableauAvantages :
• Les éléments voisins n'ont pas besoin d'être côte à côte en mémoire
• L'insertion et la suppression sont possibles sans déplacer le reste des éléments en
mémoire (ce qui serait le cas avec un tableau).
Désavantages:
de face Cuire
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
5
3. Liste liée individuellement 11
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
6
3. Liste liée individuellement 13
En utilisant l'exemple de InsertElementBack, deux détails doivent être discutés ici à nouveau.
interneInsérerÉlémentRetour(ppsNode_tppsAncre,psNode_tpsNewNodePassed);
Contrôles sanitaires :
Dans les fonctions d'insertion, une copie de psNewNodePassed est toujours faite avec
malloc. Dans InsertElementBack, il faut vérifier si cela a réussi. Il faut également vérifier si les
pointeurs ppsAnchor et psNewNodePassed ne sont pas égaux à NULL. Dans les fonctions de
suppression, la mémoire de l'élément doit également être libérée à nouveau avec free.
Sinon, des fuites de mémoire se produiront.
L'exemple de la liste chaînée montre que le code sécurisé a également une complexité
cyclomatique plus élevée (Cyclomatic Complexity CC). Le prix des vérifications
d'intégrité est donc un code machine plus étendu et plus lent.
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
distinctions de cas
Cas 1 : la liste est vide Cas 2 : la liste n'est pas vide
Ancre (psAnchorNode) Ancre (psAnchorNode)
ZÉRO 1 ZÉRO
préalablement
plus tard
Ancre (psAnchorNode) Ancre (psAnchorNode)
42 ZÉRO 1 42 ZÉRO
Copie du nœud ci-dessus Copie du nœud ci-dessus
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
7
3. Liste liée individuellement 15
distinctions de cas
Cas 1 : la liste est vide Cas 2 : la liste n'est pas vide
Ancre (psAnchorNode) Ancre (psAnchorNode)
ZÉRO 1 ZÉRO
préalablement
plus tard
Ancre (psAnchorNode) Ancre (psAnchorNode)
42 ZÉRO 42 1 ZÉRO
Copie du nœud ci-dessus Copie du nœud ci-dessus
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
1 2 ZÉRO 1 2 ZÉRO
préalablement
plus tard
Ancre (psAnchorNode) Ancre (psAnchorNode)
1 2 ZÉRO 42 1 2 ZÉRO
Copie du nœud ci-dessus
8ème
3. Liste liée individuellement 17
1 2 ZÉRO 1 2 ZÉRO
préalablement
plus tard
Ancre (psAnchorNode) Ancre (psAnchorNode)
1 2 42 ZÉRO 1 42 2 ZÉRO
Copie du nœud ci-dessus
délégationpossible à InsertElementBack
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
4. Pointeur de fonction 18
principe
S'il doit ou peut être décidé uniquement au moment de l'exécution quelle fonction doit être appelée, des
pointeurs de fonction peuvent être utilisés à cette fin.
Le code machine ainsi que les constantes se trouvent dans le segment de code CS. Les variables, en revanche, se
trouvent dans le segment de données, de pile ou de tas.
Comme pour les pointeurs, les pointeurs de fonction peuvent pointer vers des adresses en mémoire. Alors que les
pointeurs "normaux" pointent vers des variables, les pointeurs de fonction pointent vers la première instruction
machine d'une fonction (exemple de code ci-dessous : (0x)B510).
Mains "normales"sont utilisés pour lire et écrire des variables et pour lire des
variables constantes.
9
4. Pointeur de fonction 19
retour0 ;
}
Au lieu d'une constante littérale, une variable
annulerImprimerEntier(interneiVal) { constante ou une variable peut également
être passée ici.
printf("%d\n",iVal);
} Si les pointeurs de fonction sont souvent définis
avec la même valeur de transfert et de retour, alors
typedef vide(*pf_t)(interne); un typedef est recommandé. Type "Nouveau": pf_t
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
4. Pointeur de fonction 20
interneiCompteur ;
internePrincipale(annuler)
{ pour(iCompteur = 0 ;
pf = &ImprimeEntier; iCompteur <iVal;
pf(5); iCounter++)
pf = &PrintXMultipleTimes; pf(5); {
putchar('X');
}
retour0 ; putchar('\n');
} }
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
dix
4. Pointeur de fonction 21
noms de variables
annulerAppelAvecFonctionPointeur(interne,annuler(*)(interne)); // void
CallWithFunctionPointer(int iVal, void(*pf)(int)); optionnel
pf = &ImprimeEntier;
CallWithFunctionPointer(11, pf);
annulerAppelAvecFonctionPointeur(interneiVal,annuler(*PPP)(interne)) {
PPP(iVal);
}
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
4. Pointeur de fonction 22
annuler(*apf[3])(annuler);
Lorsqu'ils sont utilisés, les pointeurs de fonction doivent toujours pointer vers une fonction existante.
N'accédez jamais à l'extérieur de la baie ! L'élément de tableau avec l'index 3 est déjà invalide dans cet
exemple (pointe vers une adresse aléatoire).
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
11
4. Pointeur de fonction 23
4. Pointeur de fonction 24
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
12
4. Pointeur de fonction 25
application
annulerBibFonc(carbonisercVal,annuler(*pf)(interne)) {
si(cVal=='T') {
pf(42);
}
}
Bibliothèque
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
4. Pointeur de fonction 26
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
13
4. Pointeur de fonction 27
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1
Résumé KE 8 28
Mots-clés de C11 :
√
14