Vous êtes sur la page 1sur 14

Traduit de Allemand vers Français - www.onlinedoctranslator.

com

Unité de cours 8 :


pointeur 3

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

Durée d'enseignement de cette unité de cours : 90 minutes

Chapitres correspondantsProgrammation en C - Une introduction :Chapitre 8

Rubriques supplémentaires : tri avec QuickSort

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

pointeur vers le haut

interneje Val = 42 ; pointeur ppiVal pointeur piVal iVal variable


interne* piVal =ZÉRO;
adresse adresse évaluer
interne** ppiVal =ZÉRO;

piVal = &iVal;
ppiVal = πVal ;

printf("Valeur de iVal : %i\n", iVal);


* piVal = 73 ;
printf("Valeur de iVal : %i\n", iVal);
* * ppiVal = 4711;
printf("Valeur de iVal : %i\n", iVal);

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

interneje Val = 42 ;


Guide de style de codage C :
interne* piVal =ZÉRO;
pp pour pointeur à pointeur
interne** ppiVal =ZÉRO;

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

Application 1 : Déplacer un pointeur dans une fonction


Problème : Un pointeur doit être passé à une fonction et il doit être déplacé à
l'intérieur de celle-ci.
carboniseracTableau[] ="HS Offenbourg";
carboniser* pcArray = acArray ;// équivalent à &acArray[0]

printf("Valeur de pcArray : %c\n", *pcArray);


IncrementCharPointer1(pcArray);
printf("Valeur de pcArray : %c\n", *pcArray;
IncrementCharPointer2(&pcArray);
printf("Valeur de pcArray : %c\n", *pcArray);

annulerIncrementCharPointer1(carboniser*pc) { annulerIncrementCharPointer2(carboniser**ppc) {

pc++ ; (*ppc)++ ;
} }
Le pcArray d'origine n'est pas modifié Le pcArray d'origine est modifié

*ppc++; est faux. Voir également le guide de style de


codage C PA4.
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

1. Pointeur à pointeur 6

Domaine d'application 2 : Génération dynamique de tableaux multidimensionnels


Problème : Des tableaux multidimensionnels doivent être générés. La taille des
tableaux doit être différente.
Exemple : Un tableau contenant les chaînes "EI", "Hello World", "42" et "Ceci est une
très longue chaîne." est requis.

Solution 1 :
carboniseraacA[4][100] ; Inflexible et trop de mémoire allouée statiquement.

Solution 2 : Le nombre de chaînes de caractères et leurs tailles peuvent


également être lus avec scanf_s (flexible et peu encombrant).

carboniser*
5 0x44 ... 0x00

carboniser*
4 0x340x320x00

carboniser*
3 0x480x650x6C0x6C0x6F 0x200x570x6F 0x720x6C0x640x00
1 carboniser*
2 0x450x490x00
caractère**ppcA

Pointeur de caractère de tableau tableaux de caractères (chaînes de caractères)

Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

3
1. Pointeur à pointeur 7

Domaine d'application : Génération dynamique de tableaux multidimensionnels


ppcA = (carboniser**)malloc(4 *taille de(carboniser*));1

si(ppcA !=ZÉRO) {

ppcA[0] = (carboniser*)malloc(3 *taille de(carboniser)); // code équivalent 2


ppcA[1] = (carboniser*)malloc(12 *taille de(carboniser)); // code équivalent 3
* (ppcA + 2) = (carboniser*)malloc(3 *taille de(carboniser)); 4
* (ppcA + 3) = (carboniser*)malloc(48 *taille de(carboniser)); 5
si((ppcA[0] !=ZÉRO) && (ppcA[1] !=ZÉRO) &&
(ppcA[2] !=ZÉRO) && (ppcA[3] !=ZÉRO))
{
strncpy_s(ppcA[0], 3,"OEUF", 3); strncpy_s(ppcA[1],
12,"Bonjour le monde", 12); strncpy_s(ppcA[2], 3, Sécuriser strncpy_s - depuis C11
"42", 3);
strncpy_s(ppcA[3], 48,"C'est une chaîne vraiment très longue.", 48);

// libre ppcA[0], … si != NULL


gratuit(ppcA); libre : Ordre inverse comme avec
ppcA =ZÉRO; malloc (premiers 2,3,4,5 ou
}
5,4,3,2) alors seulement 1
}

Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

2. Structures de données 8ème

Qu'est-ce qu'une structure de données ?

En informatique et en génie logiciel, c'est l'unStructure de donnéesun objet utilisé


pour stocker et organiser des données. Il s'agit d'une structure car les données sont
organisées et liées de manière spécifique pour permettre un accès et une gestion
efficaces.
Source : wikipedia.de

Structure de données = type de données complexe + fonctions pour ce type de données complexe

Principalement structure et/ou tableau

structure typedefAdresse annulerSortAddressListByLastName(


{ psAddress_tpsAllAddress,
carboniseracLastName[30] ; entier non signéuiSize);
carboniseracPrenom[30] ; annulerImprimerListeAdresse(psAddress_tpsAllAddress,
carboniseracStreet[40] ; entier non signéuiSize);
entier non signéuiZipCode ;
carboniseracVille[40] ;
}sAdresse_t;
typedefsAdresse_t*psAddress_t;

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

Exemples de structures de données

déployer
piles File d'attente (FIFO)
dynamique (LIFO)
tableaux

Liste liée individuellement Liste doublement liée

des arbres graphique ...

Des cours tels que AI, AKI, WIN et


WINplus ont un cours séparé pour cela.
Dans ce cours, seule la liste chaînée sera
discutée en détail (et mise en œuvre)
Images de https://martin-thoma.com/overview-over-data-structures/
sera.
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

3. Liste liée individuellement dix

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:

• L'accès (E/S) prend plus de temps


• Il est plus difficile de le mettre en œuvre soi-même

Ancrage sur l'élément 1


début
article 4
(indice 3)
article 3
article 2 (indice 2)
ZÉRO
objet 1 (indice 1)
(indice 0) Fin

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

Type de données complexe pour une liste liée de manière simple

structurenœuds uiData psNextNode


{ (Espace réservé uniquement pointeur vers le suivant
entier non signéuiData ; pour les données utilisateur) élément ou NULL
structurenœuds* psNextNode ;
} ;
structure typedefNœud sNode_t;
typedefsNode_t*psNode_t; typedef
psNode_t*ppsNode_t; Objet

Définition et initialisation d'une ancre et de quatre éléments non encore concaténés

psNode_tpsAnchorNode =ZÉRO; Si l'ancre pointe vers NULL, la liste est vide


sNode_tasNodes[2] = {{1U,ZÉRO},
{2U,ZÉRO}} ;
sNode_tsNoeudA = {3U,ZÉRO} ;
psNode_tpsNode = (psNode_t)malloc(taille de(sNode_t));
psNode->psNextNode =ZÉRO; psNode->uiDummyData = 4U ;

Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

3. Liste liée individuellement 12

Fonctions de liste chaînée


La liste doit créer dynamiquement une copie des éléments de la liste.
// Fonctions API pour la liste chaînée
interneInsérerÉlémentRetour(ppsNode_tppsAncre,psNode_tpsNewNodePassed);
interneInsertElementFront(ppsNode_tppsAncre,psNode_tpsNewNodePassed); interne
InsérerÉlémentÀ (ppsNode_tppsAncre,psNode_tpsNewNodePassed,
entier non signéuiPos);
interneSupprimerÉlémentRetour(ppsNode_tppsAncre);
interneSupprimerÉlémentAvant(ppsNode_tppsAncre);
interneSupprimerÉlémentÀ (ppsNode_tppsAncre,entier non signéuiPos);
interneSupprimerListe(ppsNode_tppsAncre);
interneSupprimerÉlémentRécursif(psNode_tpsNodeDelete);

// Fonctions utilitaires pour la liste chaînée annuler


ImprimerÉléments(psNode_tpsNode); annulerImprimerListe(
psNode_tpsNodeAnchor); entier non signé
GetNumberElements(psNode_tpsNode);

Les fonctions sont spécifiées dans SolutionV301.sln - seuls DeleteElementFront et


DeleteElementAt doivent encore être implémentés en laboratoire.
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

Pointeur vers pointeur vers nœud et vérifications d'intégrité

En utilisant l'exemple de InsertElementBack, deux détails doivent être discutés ici à nouveau.

interneInsérerÉlémentRetour(ppsNode_tppsAncre,psNode_tpsNewNodePassed);

L'ancre doit êtrepointeur à pointeurpassé, car la valeur du pointeur doit être


modifiée dans la fonction appelante (voir pointeur à pointeur).

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

3. Liste liée individuellement 14

Exemple de fonction : InsertElementBack

Une copie de ce nœud doit


être ajoutée à la fin de la liste.
42 ZÉRO

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

Exemple de fonction : InsertElementFront

Une copie de ce nœud doit être


ajoutée en haut de la liste.
42 ZÉRO

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

3. Liste liée individuellement 16

Exemple de fonction : InsertElementAt (1)


Le premier élément de la liste a
Une copie de ce nœud doit être
42 ZÉRO l'index 0, le dernier élément a
insérée à l'index uiPos.
l'index (nombre d'éléments - 1)
distinctions de cas
Cas 1 : uiPos > nombre d'éléments Cas 2 : uiPos == 0
Ancre (psAnchorNode) Ancre (psAnchorNode)

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

Insertion impossible délégationpossible à InsertElementFront


Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

8ème
3. Liste liée individuellement 17

Exemple de fonction : InsertElementAt (2)


Le premier élément de la liste a
Une copie de ce nœud doit être
42 ZÉRO l'index 0, le dernier élément a
insérée à l'index uiPos.
l'index (nombre d'éléments - 1)
distinctions de cas
Cas 3 : uiPos == nombre d'éléments et uiPos != 0 Cas 4 : uiPos > 0 et uiPos < nombre d'éléments
Ancre (psAnchorNode) Ancre (psAnchorNode)

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.

pointeur de fonctionsont utilisés pour appeler des fonctions.


adresse langage machine code d'assemblage
pointeur de fonction 0x00001244 B510 APPUYER {R4,LR}
0x00001246 4816 LDR R0,[PC,#88]
Jeu d'instructions Thumb-2 0x00001248 6800 LDR R0,[R0,#0x00]
(microcontrôleur cortex)0x0000124A F0400004 ORR R0,R0,#0x04
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

9
4. Pointeur de fonction 19

Définition de pointeur de fonction, arithmétique de pointeur, typedef

annuler(*pf)(interne); Définition d'un pointeur de fonction global


annulerImprimerEntier(interneiVal); nommé pf. Attention parenthèses ! Sans
parenthèses, ce serait un
internePrincipale(annuler)
Déclaration de fonction : void* pf(int);
{
pf = &ImprimeEntier; pf pointe vers la fonction PrintInteger. Les
//pf = PrintInteger ; paramètres de transfert et la valeur de retour
doivent être compatibles.
pf(42);
pf(73); vues

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

"Retourner" les pointeurs de fonction à l'exécution


annuler(*pf) (interne); annulerImprimerEntier(interneiVal) {
annulerImpressionEntier (interneiVal);
annulerImprimerXPlusieursFois(interneiVal); printf("%d\n",iVal);
}
Les pointeurs de fonction et les fonctions
annulerImprimerXPlusieursFois(interneiVal) {
doivent être de type compatible

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

Passer des pointeurs de fonction à des fonctions


annuler(*pf) (interne);
annulerImpressionEntier (interneiVal);
annulerImprimerXPlusieursFois(interneiVal);

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

Exemple d'application 1 : Routage de fonction dynamique

annuler(*apf[3])(annuler);

déployer les fonctions


pointeur vers le haut vide f1(vide);
les fonctions etc.
en dehors du tableau (Adresse aléatoire)
pomme[3] Résout avec une forte probabilité à
exception d'appel
Événements: pomme[2] f3
capteurs,
Boutons, minuteries, ... pomme[1]
ZÉRO -Lève une f2
exception lors de l'appel
pomme[0] f1

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

Exemple d'application 1 : Routage de fonction dynamique


annuler(*apf[3])(annuler); apf[0] = &f1; pomme[2] f3
apf[1] = &f2; pomme[1] f2
annulerf1(annuler); apf[2] = &f3;
annulerf2(annuler);
pomme[0] f1
annulerf3(annuler); pomme[0]();
pomme[1]();
annulerf1(annuler) pomme[2]();
{ pomme[2] f3
met ("f1 s'appelle"); apf[0] = &f3; pomme[1] f2
}
pomme[0] f1
pomme[0]();
annulerf2(annuler) pomme[1](); A l'exécution, apf[0] est
{ pomme[2](); modifié. Le pointeur de
met ("f2 s'appelle");
fonction pointe maintenant
}
sur la fonction f3.
annulerf3(annuler) devient familier
{ dit souvent: "Le
met ("f3 est appelé"); pointeur est plié!"
}
Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

4. Pointeur de fonction 24

Exemple d'application 2 : fonction de rappel


Une fonction de rappelfonction de rappel)désigne un en informatiqueUne fonction, celui d'un
autreUne fonction,généralement une bibliothèque prête à l'emploi ou une fonction du
système d'exploitation, passée en paramètre et appelée par elle dans des conditions définies
avec des arguments définis.
Source : wikipedia.org
temps

application Dans quelques cas, une fonction de bibliothèque


doit appeler une fonction depuis l'application.
rappeler
votre interlocuteur
fonction Cependant, une bibliothèque a été développée
beaucoup plus tôt (des années) et ne connaît pas le
nom de la fonction de rappel.
La bibliothèque ne peut pas être recompilée car le
code source n'est pas disponible.
BibFunc
Ce problème peut être réalisé avec des
pointeurs de fonction.
Bibliothèque

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

Exemple d'application 2 : fonction de rappel


temps

application

Appelant (par exemple principal) annulerRappeler(interneiVal) {

BibFonc('T', &Rappeler); met ("CallBack appelé");


}

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

Fonction de rappel utilisant Quicksort comme exemple


Quicksort est une fonction de tri récursif rapide générique (indépendante du type de données) de stdlib.
Pour la comparaison (plus grand/plus petit), l'application doit fournir une fonction de comparaison (selon
le type de données). Le pointeur de fonction pfCompare pointe dessus.

void qsort(void* pvData, size_t uiNumberElements, size_t uiSizeElement,


int (*pfCompare)(const void*, const void*));

La fonction de comparaison reçoit


interneComparerEntier(const vide*pcv1,
deux pointeurs génériques vers les
const vide*pcv2)
deux variables et doit renvoyer les {
valeurs suivantes : interneiRet ;
<0 : la première variable est inférieure à interne* piV1 = (interne*)pcv1; Diffusé à partir du générique
0 : les variables sont égales interne* piV2 = (interne*)pcv2; aux pointeurs concrets
> 0 : la première variable est plus
grande. A droite une implémentation iRet = *piV1 - *piV2 ;
pour les entiers. Chaque type de
retouriRet ;
données utilisé pour qsort nécessite
}
sa propre nouvelle fonction.

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

Fonction de rappel utilisant Quicksort comme exemple


qsort est alors assez facile à utiliser.
interneiaArray[10] = { 100, -1, 10, 100, -10, 1, 0, 1000, -1000, 0 } ; interne
(*pfCompareEntier)(const vide* pcv1,const vide*pcv2);

// Affiche le tableau avant de trier

pfCompareInteger = &CompareInteger; qsort(iaTableau, 10,


taille de(interne), pfCompareInteger);

//Imprimer le tableau après le tri

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 couverts dans KE 8


Mots clés C89 :
√ √ √ √ √
√ √ √ √ √√
√ √ √ √ √
√ √ √ √ √
√ √ √ √
√ √ √ √
√ √ √ √
Mots-clés de C99 :
√ √ √ √

Mots-clés de C11 :

Aucunnouveaux mots-clés dans KE 8.


Génie informatique/programmation 2 (C) : KE 8 : pointeur 3 Prof. Dr.-Ing. Daniel Fischer - Version 3.0.1

14

Vous aimerez peut-être aussi