SlideShare una empresa de Scribd logo
1 de 7
Descargar para leer sin conexión
Rappels sur les pointeurs et tableaux
                           dans le langage C


L'utilisation des pointeurs dans le langage C est souvent orientée vers la manipulation de
tableaux. Dans ce qui suit, un rappel concis sur ces deux concepts est présenté.

1 Pointeurs et tableaux à une dimension

Tout tableau en C est en fait un pointeur constant. Dans la déclaration
int tab[10];

tab est un pointeur constant (non modifiable) dont la valeur est l'adresse du premier élément
du tableau. Autrement dit, tab a pour valeur &tab[0]. On peut donc utiliser un pointeur
initialisé à tab pour parcourir les éléments du tableau.
#define N 5
int tab[5] = {0, 1, 4, 20, 7};
main()
{
  int i;
  int *p;
  p = tab;
  for (i = 0; i < N; i++)
    {
      printf(" %d n",*p);
      p++;
    }
}

On accède à l'élément d'indice i du tableau tab grâce à l'opérateur d'indexation [], par
l'expression tab[i]. Cet opérateur d'indexation peut en fait s'appliquer à tout objet p de type
pointeur. Il est lié à l'opérateur d'indirection * par la formule

p[i] = *(p + i)

Les pointeurs et tableaux se manipulent donc exactement de la même manière. Par exemple,
le programme précédent peut aussi s'écrire
#define N 5
int tab[5] = {0, 1, 4, 20, 7};

main()
{
  int i;
  int *p;
  p = tab;
  for (i = 0; i < N; i++)
    printf(" %d n", p[i]);
}
Cependant, la manipulation de tableaux, et non de pointeurs, possède certains inconvénients
dus au fait qu'un tableau est un pointeur constant. Ainsi

    •   on ne peut pas créer de tableaux dont la taille est une variable du programme,
    •   on ne peut pas créer de tableaux bidimensionnels dont les lignes n'ont pas toutes le
        même nombre d'éléments.

Ces opérations deviennent possibles dès que l'on manipule des pointeurs alloués
dynamiquement. Ainsi, pour créer un tableau d'entiers à n éléments où n est une variable du
programme, on écrit :

#include <stdlib.h>
main()
{
  int n;
  int *tab;

     ...
    tab = (int*)malloc(n * sizeof(int));
     ...
    free(tab);
}

Si on veut en plus que tous les éléments du tableau tab soient initialisés à zéro, on remplace
l'allocation dynamique avec malloc par
    tab = (int*)calloc(n, sizeof(int));

Les éléments de tab sont manipulés avec l'opérateur d'indexation [], exactement comme pour
les tableaux.

Les deux différences principales entre un tableau et un pointeur sont

    •   un pointeur doit toujours être initialisé, soit par une allocation dynamique, soit par
        affectation d'une expression adresse, par exemple p = &i ;
    •   un tableau n'est pas une Lvalue ; il ne peut donc pas figurer à gauche d'un opérateur
        d'affectation. En particulier, un tableau ne supporte pas l'arithmétique (on ne peut pas
        écrire tab++;).

2 Pointeurs et tableaux à plusieurs dimensions

Un tableau à deux dimensions est, par définition, un tableau de tableaux. Il s'agit donc en fait
d'un pointeur vers un pointeur. Considérons le tableau à deux dimensions défini par :
int tab[M][N];

tab est un pointeur, qui pointe vers un objet lui-même de type pointeur d'entier. tab a une
valeur constante égale à l'adresse du premier élément du tableau, &tab[0][0]. De même
tab[i], pour i entre 0 et M-1, est un pointeur constant vers un objet de type entier, qui est le
premier élément de la ligne d'indice i. l’élément tab[i] a donc une valeur constante qui est
égale à &tab[i][0].

Exactement comme pour les tableaux à une dimension, les pointeurs de pointeurs ont de
nombreux avantages sur les tableaux multi-dimensionnés. On déclare un pointeur qui pointe
sur un objet de type type * (deux dimensions) de la même manière qu'un pointeur, c'est-à-
dire
type **nom-du-pointeur;

De même, un pointeur qui pointe sur un objet de type type ** (équivalent à un tableau à
3 dimensions) se déclare par
type ***nom-du-pointeur;

Par exemple, pour créer avec un pointeur de pointeur une matrice à k lignes et n colonnes à
coefficients entiers, on écrit :
main()
{
  int k, n;
  int **tab;

    tab = (int**)malloc(k * sizeof(int*));
    for (i = 0; i < k; i++)
      tab[i] = (int*)malloc(n * sizeof(int));
        ....

    for (i = 0; i < k; i++)
      free(tab[i]);
    free(tab);
}

La première allocation dynamique réserve pour l'objet pointé par tab l'espace mémoire
correspondant à k pointeurs sur des entiers. Ces k pointeurs correspondent aux lignes de la
matrice. Les allocations dynamiques suivantes réservent pour chaque pointeur tab[i]
l'espace mémoire nécessaire pour stocker n entiers.

Si on désire en plus que tous les éléments du tableau soient initialisés à zéro, il suffit de
remplacer l'allocation dynamique dans la boucle for par
     tab[i] = (int*)calloc(n, sizeof(int));

Contrairement aux tableaux à deux dimensions, on peut choisir des tailles différentes pour
chacune des lignes tab[i]. Par exemple, si l'on veut que tab[i] contienne exactement i+1
éléments, on écrit
    for (i = 0; i < k; i++)
     tab[i] = (int*)malloc((i + 1) * sizeof(int));



3 Pointeurs et chaînes de caractères
On a vu précédemment qu'une chaîne de caractères était un tableau à une dimension d'objets
de type char, se terminant par le caractère nul '0'. On peut donc manipuler toute chaîne de
caractères à l'aide d'un pointeur sur un objet de type char. On peut faire subir à une chaîne
définie par char *chaine;
des affectations comme chaine = "ceci est une chaine";
et toute opération valide sur les pointeurs, comme l'instruction chaine++;.
Ainsi, le programme suivant imprime le nombre de caractères d'une chaîne (sans compter le
caractère nul).
#include <stdio.h>
main()
{
  int i;
  char *chaine;

    chaine = "chaine de caracteres";
    for (i = 0; *chaine != '0'; i++)
      chaine++;
    printf("nombre de caracteres = %dn",i);
}

La fonction donnant la longueur d'une chaîne de caractères, définie dans la librairie standard
string.h, procède de manière identique. Il s'agit de la fonction strlen dont la syntaxe est
strlen(chaine); où chaine est un pointeur sur un objet de type char. Cette fonction
renvoie un entier dont la valeur est égale à la longueur de la chaîne passée en argument
(moins le caractère '0'). L'utilisation de pointeurs de caractère et non de tableaux permet
par exemple de créer une chaîne correspondant à la concaténation de deux chaînes de
caractères :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
  int i;
  char *chaine1, *chaine2, *res, *p;

    chaine1 = "chaine ";
    chaine2 = "de caracteres";
    res = (char*)malloc((strlen(chaine1) + strlen(chaine2)) * sizeof(char));
    p = res;
    for (i = 0; i < strlen(chaine1); i++)
      *p++ = chaine1[i];
    for (i = 0; i < strlen(chaine2); i++)
      *p++ = chaine2[i];
    printf("%sn",res);
}

Remarquons l'indispensable utilisation d'un pointeur intermédiaire p dès que l'on effectue des
opérations de type incrémentation. En effet, si on avait incrémenté directement la valeur de
res, on aurait évidemment ``perdu'' la référence sur le premier caractère de la chaîne. Par
exemple,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
  int i;
  char *chaine1, *chaine2, *res;
  chaine1 = "chaine ";
  chaine2 = "de caracteres";
  res = (char*)malloc((strlen(chaine1) + strlen(chaine2)) * sizeof(char));
for (i = 0; i < strlen(chaine1); i++)
      *res++ = chaine1[i];
    for (i = 0; i < strlen(chaine2); i++)
      *res++ = chaine2[i];
    printf("n nombre de caracteres de res = %dn",strlen(res));
}

imprime la valeur 0, puisque res a été modifié au cours du programme et pointe maintenant
sur le caractère nul.

6 Pointeurs et structures
6.1 Pointeur sur une structure
Contrairement aux tableaux, les objets de type structure en C sont des Lvalues. Ils possèdent
une adresse, correspondant à l'adresse du premier élément du premier membre de la structure.
On peut donc manipuler des pointeurs sur des structures. Ainsi, le programme suivant crée, à
l'aide d'un pointeur, un tableau d'objets de type structure.
#include <stdlib.h>
#include <stdio.h>

struct eleve{
  char nom[20];
  int date;
};

typedef struct eleve *classe;

main()
{
  int n, i;
  classe tab;

    printf("nombre d'eleves de la classe = ");
    scanf("%d",&n);
    tab = (classe)malloc(n * sizeof(struct eleve));
    for (i =0 ; i < n; i++)
      {
        printf("n saisie de l'eleve numero %dn",i);
        printf("nom de l'eleve = ");
        scanf("%s",&tab[i].nom);
        printf("n date de naissance JJMMAA = ");
        scanf("%d",&tab[i].date);
      }
    printf("n Entrez un numero ");
    scanf("%d",&i);
    printf("n Eleve numero %d:",i);
    printf("n nom = %s",tab[i].nom);
    printf("n date de naissance = %dn",tab[i].date);
    free(tab);
}

Si p est un pointeur sur une structure, on peut accéder à un membre de la structure pointé par
l'expression (*p).membre
L'utilisation de parenthèses est ici indispensable car l'opérateur d'indirection * à une priorité
plus élevée que l'opérateur de membre de structure. Cette notation peut être simplifiée grâce à
l'opérateur pointeur de membre de structure, noté ->.
L'expression précédente est strictement équivalente à p->membre Ainsi, dans le programme
précédent, on peut remplacer tab[i].nom et tab[i].date respectivement par (tab + i)-
>nom et (tab + i)->date.


6.2 Structures auto-référencées
On a souvent besoin en C de modèles de structure dont un des membres est un pointeur vers
une structure de même modèle. Cette représentation permet en particulier de construire des
listes chaînées. En effet, il est possible de représenter une liste d'éléments de même type par
un tableau (ou un pointeur). Toutefois, cette représentation, dite contiguë, impose que la taille
maximale de la liste soit connue a priori (on a besoin du nombre d'éléments du tableau lors de
l'allocation dynamique). Pour résoudre ce problème, on utilise une représentation chaînée :
l'élément de base de la chaîne est une structure appelée cellule qui contient la valeur d'un
élément de la liste et un pointeur sur l'élément suivant. Le dernier élément pointe sur la liste
vide NULL. La liste est alors définie comme un pointeur sur le premier élément de la chaîne.

Pour représenter une liste d'entiers sous forme chaînée, on crée le modèle de structure
cellule qui a deux champs : un champ valeur de type int, et un champ suivant de type
pointeur sur une struct cellule. Une liste sera alors un objet de type pointeur sur une
struct cellule. Grâce au mot-clef typedef, on peut définir le type liste, synonyme du
type pointeur sur une struct cellule.

struct cellule
{
  int valeur;
  struct cellule *suivant;
};

typedef struct cellule *liste;

Un des avantages de la représentation chaînée est qu'il est très facile d'insérer un élément à un
endroit quelconque de la liste. Ainsi, pour insérer un élément en tête de liste, on utilise la
fonction suivante :
liste insere(int element, liste Q)
{
  liste L;
  L = (liste)malloc(sizeof(struct cellule));
  L->valeur = element;
  L->suivant = Q;
  return(L);
}

Le programme suivant crée une liste d'entiers et l'imprime à l'écran :
#include <stdlib.h>
#include <stdio.h>
struct cellule
{
  int valeur;
  struct cellule *suivant;
};
typedef struct cellule *liste;


liste insere(int element, liste Q)
{
  liste L;
  L = (liste)malloc(sizeof(struct cellule));
  L->valeur = element;
  L->suivant = Q;
  return(L);
}

main()
{
  liste L, P;
  L = insere(1,insere(2,insere(3,insere(4,NULL))));
  printf("n impression de la liste:n");
  P = L;
  while (P != NULL)
    {
      printf("%d t",P->valeur);
      P = P->suivant;
    }
}

On utilisera également une structure auto-référencée pour créer un arbre binaire :
struct noeud
{
  int valeur;
  struct noeud *fils_gauche;
  struct noeud *fils_droit;
};

typedef struct noeud *arbre;

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

02 correction-td smi-s3-algo2
02 correction-td smi-s3-algo202 correction-td smi-s3-algo2
02 correction-td smi-s3-algo2
 
Chapitre3TableauxEnCppV2019
Chapitre3TableauxEnCppV2019Chapitre3TableauxEnCppV2019
Chapitre3TableauxEnCppV2019
 
Cours Algorithme: Tableau
Cours Algorithme: TableauCours Algorithme: Tableau
Cours Algorithme: Tableau
 
Ebook matlab
Ebook matlabEbook matlab
Ebook matlab
 
Chapitre3 tableauxcpp
Chapitre3 tableauxcppChapitre3 tableauxcpp
Chapitre3 tableauxcpp
 
Tp2 matlab
Tp2 matlab Tp2 matlab
Tp2 matlab
 
57277345 cours-matlab
57277345 cours-matlab57277345 cours-matlab
57277345 cours-matlab
 
Cours Algorithme: Matrice
Cours Algorithme: MatriceCours Algorithme: Matrice
Cours Algorithme: Matrice
 
Support matlab st
Support matlab stSupport matlab st
Support matlab st
 
Tp 2 vecteur et matrice
Tp 2 vecteur et matriceTp 2 vecteur et matrice
Tp 2 vecteur et matrice
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Matlab
MatlabMatlab
Matlab
 
Chapitre 1 rappel
Chapitre 1   rappelChapitre 1   rappel
Chapitre 1 rappel
 
Cours matlab gpe
Cours matlab gpeCours matlab gpe
Cours matlab gpe
 
Algorithmes sur les graphes Problème du voyageur de commerce: Algorithme de L...
Algorithmes sur les graphes Problème du voyageur de commerce: Algorithme de L...Algorithmes sur les graphes Problème du voyageur de commerce: Algorithme de L...
Algorithmes sur les graphes Problème du voyageur de commerce: Algorithme de L...
 
Cours 1 bases de matlab 2eme annees
Cours 1   bases de matlab 2eme anneesCours 1   bases de matlab 2eme annees
Cours 1 bases de matlab 2eme annees
 
Cours d'algorithmique
Cours d'algorithmiqueCours d'algorithmique
Cours d'algorithmique
 
Langage c partie_2
Langage c partie_2Langage c partie_2
Langage c partie_2
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
Mathématiques et Python
Mathématiques et PythonMathématiques et Python
Mathématiques et Python
 

Destacado

¿Cómo poner en marcha de forma efectiva una campaña de crowdfunding?
¿Cómo poner en marcha de forma efectiva una campaña de crowdfunding?¿Cómo poner en marcha de forma efectiva una campaña de crowdfunding?
¿Cómo poner en marcha de forma efectiva una campaña de crowdfunding?Miguel Ángel Trujillo
 
La population. raúl idáñez
La population. raúl idáñezLa population. raúl idáñez
La population. raúl idáñezjlealleon
 
Synthèse résultats enquête loi bertrand
Synthèse résultats enquête loi bertrandSynthèse résultats enquête loi bertrand
Synthèse résultats enquête loi bertrandMarket iT
 
NI LOMCE, ni LEC ni retallades
NI LOMCE, ni LEC ni retalladesNI LOMCE, ni LEC ni retallades
NI LOMCE, ni LEC ni retalladesmalcazar
 
PresentacióN1
PresentacióN1PresentacióN1
PresentacióN1salvcon
 
El poder de_la_educacion
El poder de_la_educacionEl poder de_la_educacion
El poder de_la_educacionAdalberto
 
MOOC-BRVM : Retour d'experience de l'IMAT-ABIDJAN : Business School
MOOC-BRVM : Retour d'experience de l'IMAT-ABIDJAN : Business SchoolMOOC-BRVM : Retour d'experience de l'IMAT-ABIDJAN : Business School
MOOC-BRVM : Retour d'experience de l'IMAT-ABIDJAN : Business SchoolJoseph Tetchi
 
Agresividad
Agresividad Agresividad
Agresividad Adalberto
 
Présentation réunion d'info ANT Pays de Bitche 2013
Présentation réunion d'info ANT Pays de Bitche 2013Présentation réunion d'info ANT Pays de Bitche 2013
Présentation réunion d'info ANT Pays de Bitche 2013Sophie Ensminger Pro
 
Le contrat de sécurisation professionnelle (Unédic - février 2012)
Le contrat de sécurisation professionnelle (Unédic - février 2012)Le contrat de sécurisation professionnelle (Unédic - février 2012)
Le contrat de sécurisation professionnelle (Unédic - février 2012)Nathalie SALLES
 
Elementos de un proyecto de investigacion
Elementos de un proyecto de investigacionElementos de un proyecto de investigacion
Elementos de un proyecto de investigacionAdalberto
 
Programme Casino Barrière de Menton - été 2014
Programme Casino Barrière de Menton - été 2014Programme Casino Barrière de Menton - été 2014
Programme Casino Barrière de Menton - été 2014Aurélie Vaucher
 
La 4 f autour du monde 97
La 4 f autour du monde 97La 4 f autour du monde 97
La 4 f autour du monde 97cdi-erasme
 
TRABAJO NOTICIA TECNOLOGÍA
TRABAJO NOTICIA TECNOLOGÍATRABAJO NOTICIA TECNOLOGÍA
TRABAJO NOTICIA TECNOLOGÍASoniadiosss
 

Destacado (20)

¿Cómo poner en marcha de forma efectiva una campaña de crowdfunding?
¿Cómo poner en marcha de forma efectiva una campaña de crowdfunding?¿Cómo poner en marcha de forma efectiva una campaña de crowdfunding?
¿Cómo poner en marcha de forma efectiva una campaña de crowdfunding?
 
La population. raúl idáñez
La population. raúl idáñezLa population. raúl idáñez
La population. raúl idáñez
 
Plaquette formation
Plaquette formationPlaquette formation
Plaquette formation
 
Synthèse résultats enquête loi bertrand
Synthèse résultats enquête loi bertrandSynthèse résultats enquête loi bertrand
Synthèse résultats enquête loi bertrand
 
NI LOMCE, ni LEC ni retallades
NI LOMCE, ni LEC ni retalladesNI LOMCE, ni LEC ni retallades
NI LOMCE, ni LEC ni retallades
 
PresentacióN1
PresentacióN1PresentacióN1
PresentacióN1
 
El poder de_la_educacion
El poder de_la_educacionEl poder de_la_educacion
El poder de_la_educacion
 
Desert magique pps
Desert magique ppsDesert magique pps
Desert magique pps
 
Le web sémantique - Sylvie Fayet
Le web sémantique - Sylvie FayetLe web sémantique - Sylvie Fayet
Le web sémantique - Sylvie Fayet
 
Series funcionales
Series funcionalesSeries funcionales
Series funcionales
 
MOOC-BRVM : Retour d'experience de l'IMAT-ABIDJAN : Business School
MOOC-BRVM : Retour d'experience de l'IMAT-ABIDJAN : Business SchoolMOOC-BRVM : Retour d'experience de l'IMAT-ABIDJAN : Business School
MOOC-BRVM : Retour d'experience de l'IMAT-ABIDJAN : Business School
 
Agresividad
Agresividad Agresividad
Agresividad
 
Présentation réunion d'info ANT Pays de Bitche 2013
Présentation réunion d'info ANT Pays de Bitche 2013Présentation réunion d'info ANT Pays de Bitche 2013
Présentation réunion d'info ANT Pays de Bitche 2013
 
Le contrat de sécurisation professionnelle (Unédic - février 2012)
Le contrat de sécurisation professionnelle (Unédic - février 2012)Le contrat de sécurisation professionnelle (Unédic - février 2012)
Le contrat de sécurisation professionnelle (Unédic - février 2012)
 
Elementos de un proyecto de investigacion
Elementos de un proyecto de investigacionElementos de un proyecto de investigacion
Elementos de un proyecto de investigacion
 
éTude tns ilres 07.11.12
éTude tns ilres 07.11.12éTude tns ilres 07.11.12
éTude tns ilres 07.11.12
 
Programme Casino Barrière de Menton - été 2014
Programme Casino Barrière de Menton - été 2014Programme Casino Barrière de Menton - été 2014
Programme Casino Barrière de Menton - été 2014
 
Test pp
Test ppTest pp
Test pp
 
La 4 f autour du monde 97
La 4 f autour du monde 97La 4 f autour du monde 97
La 4 f autour du monde 97
 
TRABAJO NOTICIA TECNOLOGÍA
TRABAJO NOTICIA TECNOLOGÍATRABAJO NOTICIA TECNOLOGÍA
TRABAJO NOTICIA TECNOLOGÍA
 

Similar a Pointeuren c

Ch5-les tableaux et les pointeurs.pdf
Ch5-les tableaux et les pointeurs.pdfCh5-les tableaux et les pointeurs.pdf
Ch5-les tableaux et les pointeurs.pdfFadouaBouafifSamoud
 
Chapitre 8 - Les tableaux et les pointeurs.pdf
Chapitre 8 - Les tableaux et les pointeurs.pdfChapitre 8 - Les tableaux et les pointeurs.pdf
Chapitre 8 - Les tableaux et les pointeurs.pdfShiniGami0o0
 
resume algo 2023.pdf
resume algo 2023.pdfresume algo 2023.pdf
resume algo 2023.pdfsalah fenni
 
ch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfFadouaBouafifSamoud
 
Ch2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfCh2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfFadouaBouafifSamoud
 
Chapitre 3 elements de base de java
Chapitre 3  elements de base de javaChapitre 3  elements de base de java
Chapitre 3 elements de base de javaAmir Souissi
 
eExercices corrigesdivers
eExercices corrigesdiverseExercices corrigesdivers
eExercices corrigesdiversHajar Yazine
 
Les Structures de données
Les Structures de donnéesLes Structures de données
Les Structures de donnéesHichem Kemali
 
cours-5.1.pdf
cours-5.1.pdfcours-5.1.pdf
cours-5.1.pdfGonnaBe1
 
Cours-ALGORITHMIQUE-03.pdf
Cours-ALGORITHMIQUE-03.pdfCours-ALGORITHMIQUE-03.pdf
Cours-ALGORITHMIQUE-03.pdfadeljaouadi
 
RCarte_Commandes-R.pdf
RCarte_Commandes-R.pdfRCarte_Commandes-R.pdf
RCarte_Commandes-R.pdfDrissRifai1
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniShellmates
 
Bases de php - Partie 4
Bases de php - Partie 4Bases de php - Partie 4
Bases de php - Partie 4Régis Lutter
 
Tableau a deux dimensions (1).pptx
Tableau a deux dimensions (1).pptxTableau a deux dimensions (1).pptx
Tableau a deux dimensions (1).pptxPROFPROF11
 

Similar a Pointeuren c (20)

Ch5-les tableaux et les pointeurs.pdf
Ch5-les tableaux et les pointeurs.pdfCh5-les tableaux et les pointeurs.pdf
Ch5-les tableaux et les pointeurs.pdf
 
Chapitre 8 - Les tableaux et les pointeurs.pdf
Chapitre 8 - Les tableaux et les pointeurs.pdfChapitre 8 - Les tableaux et les pointeurs.pdf
Chapitre 8 - Les tableaux et les pointeurs.pdf
 
resume algo 2023.pdf
resume algo 2023.pdfresume algo 2023.pdf
resume algo 2023.pdf
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
 
ch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdfch7_les chaines de caractères.pdf
ch7_les chaines de caractères.pdf
 
POO-chapitre6.pptx
POO-chapitre6.pptxPOO-chapitre6.pptx
POO-chapitre6.pptx
 
Ch2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdfCh2-Notions de base & actions élémentaires.pdf
Ch2-Notions de base & actions élémentaires.pdf
 
Chapitre 3 elements de base de java
Chapitre 3  elements de base de javaChapitre 3  elements de base de java
Chapitre 3 elements de base de java
 
eExercices corrigesdivers
eExercices corrigesdiverseExercices corrigesdivers
eExercices corrigesdivers
 
Language-C.ppt
Language-C.pptLanguage-C.ppt
Language-C.ppt
 
Les Structures de données
Les Structures de donnéesLes Structures de données
Les Structures de données
 
cours-5.1.pdf
cours-5.1.pdfcours-5.1.pdf
cours-5.1.pdf
 
Cours-ALGORITHMIQUE-03.pdf
Cours-ALGORITHMIQUE-03.pdfCours-ALGORITHMIQUE-03.pdf
Cours-ALGORITHMIQUE-03.pdf
 
RCarte_Commandes-R.pdf
RCarte_Commandes-R.pdfRCarte_Commandes-R.pdf
RCarte_Commandes-R.pdf
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Bases de php - Partie 4
Bases de php - Partie 4Bases de php - Partie 4
Bases de php - Partie 4
 
TABLEUR Excel
TABLEUR ExcelTABLEUR Excel
TABLEUR Excel
 
Tp01
Tp01Tp01
Tp01
 
Chapitre 2
Chapitre 2Chapitre 2
Chapitre 2
 
Tableau a deux dimensions (1).pptx
Tableau a deux dimensions (1).pptxTableau a deux dimensions (1).pptx
Tableau a deux dimensions (1).pptx
 

Último

Saint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxSaint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxMartin M Flynn
 
Présentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxPrésentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxrababouerdighi
 
Cours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETCours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETMedBechir
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .Txaruka
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSKennel
 
Bernard Réquichot.pptx Peintre français
Bernard Réquichot.pptx   Peintre françaisBernard Réquichot.pptx   Peintre français
Bernard Réquichot.pptx Peintre françaisTxaruka
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeXL Groupe
 
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 37
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...Faga1939
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSKennel
 
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 37
 
Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Alain Marois
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Gilles Le Page
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETMedBechir
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSKennel
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsRajiAbdelghani
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSKennel
 
Evaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxEvaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxAsmaa105193
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSKennel
 

Último (20)

Saint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptxSaint Georges, martyr, et la lègend du dragon.pptx
Saint Georges, martyr, et la lègend du dragon.pptx
 
Présentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptxPrésentation_ Didactique 1_SVT (S4) complet.pptx
Présentation_ Didactique 1_SVT (S4) complet.pptx
 
Cours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSETCours SE Gestion des périphériques - IG IPSET
Cours SE Gestion des périphériques - IG IPSET
 
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .Annie   Ernaux  Extérieurs. pptx. Exposition basée sur un livre .
Annie Ernaux Extérieurs. pptx. Exposition basée sur un livre .
 
DO PALÁCIO À ASSEMBLEIA .
DO PALÁCIO À ASSEMBLEIA                 .DO PALÁCIO À ASSEMBLEIA                 .
DO PALÁCIO À ASSEMBLEIA .
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
 
Bernard Réquichot.pptx Peintre français
Bernard Réquichot.pptx   Peintre françaisBernard Réquichot.pptx   Peintre français
Bernard Réquichot.pptx Peintre français
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directe
 
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
 
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
 
Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024
 
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSETCours SE Le système Linux : La ligne de commande bash - IG IPSET
Cours SE Le système Linux : La ligne de commande bash - IG IPSET
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
 
Principe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 tempsPrincipe de fonctionnement d'un moteur 4 temps
Principe de fonctionnement d'un moteur 4 temps
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
 
Evaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. MarocpptxEvaluation du systeme d'Education. Marocpptx
Evaluation du systeme d'Education. Marocpptx
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
 

Pointeuren c

  • 1. Rappels sur les pointeurs et tableaux dans le langage C L'utilisation des pointeurs dans le langage C est souvent orientée vers la manipulation de tableaux. Dans ce qui suit, un rappel concis sur ces deux concepts est présenté. 1 Pointeurs et tableaux à une dimension Tout tableau en C est en fait un pointeur constant. Dans la déclaration int tab[10]; tab est un pointeur constant (non modifiable) dont la valeur est l'adresse du premier élément du tableau. Autrement dit, tab a pour valeur &tab[0]. On peut donc utiliser un pointeur initialisé à tab pour parcourir les éléments du tableau. #define N 5 int tab[5] = {0, 1, 4, 20, 7}; main() { int i; int *p; p = tab; for (i = 0; i < N; i++) { printf(" %d n",*p); p++; } } On accède à l'élément d'indice i du tableau tab grâce à l'opérateur d'indexation [], par l'expression tab[i]. Cet opérateur d'indexation peut en fait s'appliquer à tout objet p de type pointeur. Il est lié à l'opérateur d'indirection * par la formule p[i] = *(p + i) Les pointeurs et tableaux se manipulent donc exactement de la même manière. Par exemple, le programme précédent peut aussi s'écrire #define N 5 int tab[5] = {0, 1, 4, 20, 7}; main() { int i; int *p; p = tab; for (i = 0; i < N; i++) printf(" %d n", p[i]); }
  • 2. Cependant, la manipulation de tableaux, et non de pointeurs, possède certains inconvénients dus au fait qu'un tableau est un pointeur constant. Ainsi • on ne peut pas créer de tableaux dont la taille est une variable du programme, • on ne peut pas créer de tableaux bidimensionnels dont les lignes n'ont pas toutes le même nombre d'éléments. Ces opérations deviennent possibles dès que l'on manipule des pointeurs alloués dynamiquement. Ainsi, pour créer un tableau d'entiers à n éléments où n est une variable du programme, on écrit : #include <stdlib.h> main() { int n; int *tab; ... tab = (int*)malloc(n * sizeof(int)); ... free(tab); } Si on veut en plus que tous les éléments du tableau tab soient initialisés à zéro, on remplace l'allocation dynamique avec malloc par tab = (int*)calloc(n, sizeof(int)); Les éléments de tab sont manipulés avec l'opérateur d'indexation [], exactement comme pour les tableaux. Les deux différences principales entre un tableau et un pointeur sont • un pointeur doit toujours être initialisé, soit par une allocation dynamique, soit par affectation d'une expression adresse, par exemple p = &i ; • un tableau n'est pas une Lvalue ; il ne peut donc pas figurer à gauche d'un opérateur d'affectation. En particulier, un tableau ne supporte pas l'arithmétique (on ne peut pas écrire tab++;). 2 Pointeurs et tableaux à plusieurs dimensions Un tableau à deux dimensions est, par définition, un tableau de tableaux. Il s'agit donc en fait d'un pointeur vers un pointeur. Considérons le tableau à deux dimensions défini par : int tab[M][N]; tab est un pointeur, qui pointe vers un objet lui-même de type pointeur d'entier. tab a une valeur constante égale à l'adresse du premier élément du tableau, &tab[0][0]. De même tab[i], pour i entre 0 et M-1, est un pointeur constant vers un objet de type entier, qui est le premier élément de la ligne d'indice i. l’élément tab[i] a donc une valeur constante qui est égale à &tab[i][0]. Exactement comme pour les tableaux à une dimension, les pointeurs de pointeurs ont de
  • 3. nombreux avantages sur les tableaux multi-dimensionnés. On déclare un pointeur qui pointe sur un objet de type type * (deux dimensions) de la même manière qu'un pointeur, c'est-à- dire type **nom-du-pointeur; De même, un pointeur qui pointe sur un objet de type type ** (équivalent à un tableau à 3 dimensions) se déclare par type ***nom-du-pointeur; Par exemple, pour créer avec un pointeur de pointeur une matrice à k lignes et n colonnes à coefficients entiers, on écrit : main() { int k, n; int **tab; tab = (int**)malloc(k * sizeof(int*)); for (i = 0; i < k; i++) tab[i] = (int*)malloc(n * sizeof(int)); .... for (i = 0; i < k; i++) free(tab[i]); free(tab); } La première allocation dynamique réserve pour l'objet pointé par tab l'espace mémoire correspondant à k pointeurs sur des entiers. Ces k pointeurs correspondent aux lignes de la matrice. Les allocations dynamiques suivantes réservent pour chaque pointeur tab[i] l'espace mémoire nécessaire pour stocker n entiers. Si on désire en plus que tous les éléments du tableau soient initialisés à zéro, il suffit de remplacer l'allocation dynamique dans la boucle for par tab[i] = (int*)calloc(n, sizeof(int)); Contrairement aux tableaux à deux dimensions, on peut choisir des tailles différentes pour chacune des lignes tab[i]. Par exemple, si l'on veut que tab[i] contienne exactement i+1 éléments, on écrit for (i = 0; i < k; i++) tab[i] = (int*)malloc((i + 1) * sizeof(int)); 3 Pointeurs et chaînes de caractères On a vu précédemment qu'une chaîne de caractères était un tableau à une dimension d'objets de type char, se terminant par le caractère nul '0'. On peut donc manipuler toute chaîne de caractères à l'aide d'un pointeur sur un objet de type char. On peut faire subir à une chaîne définie par char *chaine; des affectations comme chaine = "ceci est une chaine"; et toute opération valide sur les pointeurs, comme l'instruction chaine++;.
  • 4. Ainsi, le programme suivant imprime le nombre de caractères d'une chaîne (sans compter le caractère nul). #include <stdio.h> main() { int i; char *chaine; chaine = "chaine de caracteres"; for (i = 0; *chaine != '0'; i++) chaine++; printf("nombre de caracteres = %dn",i); } La fonction donnant la longueur d'une chaîne de caractères, définie dans la librairie standard string.h, procède de manière identique. Il s'agit de la fonction strlen dont la syntaxe est strlen(chaine); où chaine est un pointeur sur un objet de type char. Cette fonction renvoie un entier dont la valeur est égale à la longueur de la chaîne passée en argument (moins le caractère '0'). L'utilisation de pointeurs de caractère et non de tableaux permet par exemple de créer une chaîne correspondant à la concaténation de deux chaînes de caractères : #include <stdio.h> #include <stdlib.h> #include <string.h> main() { int i; char *chaine1, *chaine2, *res, *p; chaine1 = "chaine "; chaine2 = "de caracteres"; res = (char*)malloc((strlen(chaine1) + strlen(chaine2)) * sizeof(char)); p = res; for (i = 0; i < strlen(chaine1); i++) *p++ = chaine1[i]; for (i = 0; i < strlen(chaine2); i++) *p++ = chaine2[i]; printf("%sn",res); } Remarquons l'indispensable utilisation d'un pointeur intermédiaire p dès que l'on effectue des opérations de type incrémentation. En effet, si on avait incrémenté directement la valeur de res, on aurait évidemment ``perdu'' la référence sur le premier caractère de la chaîne. Par exemple, #include <stdio.h> #include <stdlib.h> #include <string.h> main() { int i; char *chaine1, *chaine2, *res; chaine1 = "chaine "; chaine2 = "de caracteres"; res = (char*)malloc((strlen(chaine1) + strlen(chaine2)) * sizeof(char));
  • 5. for (i = 0; i < strlen(chaine1); i++) *res++ = chaine1[i]; for (i = 0; i < strlen(chaine2); i++) *res++ = chaine2[i]; printf("n nombre de caracteres de res = %dn",strlen(res)); } imprime la valeur 0, puisque res a été modifié au cours du programme et pointe maintenant sur le caractère nul. 6 Pointeurs et structures 6.1 Pointeur sur une structure Contrairement aux tableaux, les objets de type structure en C sont des Lvalues. Ils possèdent une adresse, correspondant à l'adresse du premier élément du premier membre de la structure. On peut donc manipuler des pointeurs sur des structures. Ainsi, le programme suivant crée, à l'aide d'un pointeur, un tableau d'objets de type structure. #include <stdlib.h> #include <stdio.h> struct eleve{ char nom[20]; int date; }; typedef struct eleve *classe; main() { int n, i; classe tab; printf("nombre d'eleves de la classe = "); scanf("%d",&n); tab = (classe)malloc(n * sizeof(struct eleve)); for (i =0 ; i < n; i++) { printf("n saisie de l'eleve numero %dn",i); printf("nom de l'eleve = "); scanf("%s",&tab[i].nom); printf("n date de naissance JJMMAA = "); scanf("%d",&tab[i].date); } printf("n Entrez un numero "); scanf("%d",&i); printf("n Eleve numero %d:",i); printf("n nom = %s",tab[i].nom); printf("n date de naissance = %dn",tab[i].date); free(tab); } Si p est un pointeur sur une structure, on peut accéder à un membre de la structure pointé par l'expression (*p).membre
  • 6. L'utilisation de parenthèses est ici indispensable car l'opérateur d'indirection * à une priorité plus élevée que l'opérateur de membre de structure. Cette notation peut être simplifiée grâce à l'opérateur pointeur de membre de structure, noté ->. L'expression précédente est strictement équivalente à p->membre Ainsi, dans le programme précédent, on peut remplacer tab[i].nom et tab[i].date respectivement par (tab + i)- >nom et (tab + i)->date. 6.2 Structures auto-référencées On a souvent besoin en C de modèles de structure dont un des membres est un pointeur vers une structure de même modèle. Cette représentation permet en particulier de construire des listes chaînées. En effet, il est possible de représenter une liste d'éléments de même type par un tableau (ou un pointeur). Toutefois, cette représentation, dite contiguë, impose que la taille maximale de la liste soit connue a priori (on a besoin du nombre d'éléments du tableau lors de l'allocation dynamique). Pour résoudre ce problème, on utilise une représentation chaînée : l'élément de base de la chaîne est une structure appelée cellule qui contient la valeur d'un élément de la liste et un pointeur sur l'élément suivant. Le dernier élément pointe sur la liste vide NULL. La liste est alors définie comme un pointeur sur le premier élément de la chaîne. Pour représenter une liste d'entiers sous forme chaînée, on crée le modèle de structure cellule qui a deux champs : un champ valeur de type int, et un champ suivant de type pointeur sur une struct cellule. Une liste sera alors un objet de type pointeur sur une struct cellule. Grâce au mot-clef typedef, on peut définir le type liste, synonyme du type pointeur sur une struct cellule. struct cellule { int valeur; struct cellule *suivant; }; typedef struct cellule *liste; Un des avantages de la représentation chaînée est qu'il est très facile d'insérer un élément à un endroit quelconque de la liste. Ainsi, pour insérer un élément en tête de liste, on utilise la fonction suivante : liste insere(int element, liste Q) { liste L; L = (liste)malloc(sizeof(struct cellule)); L->valeur = element; L->suivant = Q; return(L); } Le programme suivant crée une liste d'entiers et l'imprime à l'écran : #include <stdlib.h> #include <stdio.h> struct cellule { int valeur; struct cellule *suivant;
  • 7. }; typedef struct cellule *liste; liste insere(int element, liste Q) { liste L; L = (liste)malloc(sizeof(struct cellule)); L->valeur = element; L->suivant = Q; return(L); } main() { liste L, P; L = insere(1,insere(2,insere(3,insere(4,NULL)))); printf("n impression de la liste:n"); P = L; while (P != NULL) { printf("%d t",P->valeur); P = P->suivant; } } On utilisera également une structure auto-référencée pour créer un arbre binaire : struct noeud { int valeur; struct noeud *fils_gauche; struct noeud *fils_droit; }; typedef struct noeud *arbre;