Retour à l'index

Pointeur et tableau

Nous n'avons pas, jusqu'ici, utilisé de tableau comme argument d'une fonction. Nous allons voir comment mettre en place ceci.

Pointeur comme index

Notion

Introduction. En langage C, l'accès à un élément d'un tableau peut se faire classiquement par le nom du tableau accompagné d'un index, mais aussi par un pointeur manipulé par des opérations spécifiques, comme nous allons le voir.
Exemple. Considérons le tableau :
int NOTE [30];

On peut accéder à la première note par un indice, par exemple :
NOTE[0] = 10;

mais on peut aussi utiliser un pointeur :
						int *PTR;
						PTR = &NOTE[0]; 
					
C'est plutôt une façon compliquée de faire mais c'est possible d'après ce que nous savons de l'adressage indirect.

Addition des pointeurs

Introduction. Pour accéder à l'élément d'indice 3 on peut continuer par :
						NOTE[3] = 12; 
					
mais aussi, et ceci est nouveau, par :
						PTR = PTR + 3; 
						*PTR = 12; 
					
On a utilisé l'addition des pointeurs, c'est-à-dire la possibilité d'ajouter à un pointeur une expression entière n. On augmente ainsi l'adresse, non pas de n (pour passer au n-ième octet, ou plus petit élément adressable, suivant), mais du nombre nécessaire, suivant le type pointeur, pour que l'adresse corresponde au début du n-ième élément suivant. Par exemple, pour un pointeur sur entier (dont "entier" est codé sur 4 octet) augmenter de n, on ajoute a l'adresse initiale du pointeur la valeur 'n*4'.
Syntaxe. La syntaxe de l'addition des pointeurs est :
						pointeur 1 = pointeur 2 + entier;
					
où entier désigne une expression entière.
Incrémentation. Dans le cas d'une addition de un, on peut utiliser les abréviations usuelles du C, à savoir PTR++ ou ++PTR.

Soustraction des pointeurs

Introduction. On peut utiliser de même la soustraction sur les pointeurs. Par exemple :
						PTR = PTR - 2;
					
nous ramène a l'élément contenu deux case plus haut dans le tableau.
Syntaxe. La syntaxe de la soustraction des pointeurs est :
						PTR 1 = PTR 2 - entier;
					
ou :
						A = PTR 1 - PTR 2;
					
où entier est une expression entière et A une variable entière.
Sémantique. Nous avons vu l'intérêt de la première forme pour revenir à des éléments antérieurs dans un tableau. La deuxième forme permet de savoir de combien d'éléments sont séparées deux adresses.
Décrémentation. On peut utiliser la décrémentation PTR-- ou --PTR.

Nom de tableau et pointeur

Introduction. En langage C le nom d'un tableau, par exemple NOTE, correspond à l'adresse de son premier élément &NOTE[0]. Ce n'est cependant pas un pointeur, ou plus exactement une variable pointeur. Il s'agit d'un pointeur constant dont on ne peut pas modifier le contenu (ce n'est pas une L-value).
On ne peut pas écrire, par exemple :
						NOTE = NOTE + 2; 
					
pour accéder à l'élément d'indice 2. Il faut, pour cela, passer par une variable pointeur auxiliaire :
						INT* PTR;
						PTR = NOTE; 
						PTR = PTR + 2; 
						ou même : 
						PTR = NOTE + 2; 
					

Tableau comme paramètre de fonction

Introduction. En langage C les tableaux sont toujours transmis par adresse à une fonction. Par exemple pour déclarer une fonction qui trie un tableau d'entiers de dimension effective n on écrira :
						void TRI(int *TAB, int n);
					
ou mieux (mais c'est la même chose) :
						void TRI(int TAB[], int n); 
					
Commentaires.
  • TAB est un pointeur sur un entier, sur un seul entier. C'est normal puisque nous avons vu que le nom d'un tableau, par exemple TAB, correspond à l'adresse &TAB[0] de son premier élément.
  • On passe à la fonction TRI l'adresse du premier élément du tableau et la dimension effective du tableau mais pas sa dimension maximum.
    En effet celle-ci n'est pas indispensable : le tableau que l'on passera comme argument est déclaré par ailleurs et c'est à ce moment que l'on déclare sa dimension maximum. Il faut cependant que la dimension effective soit inférieure à la dimension maximum pour ne pas avoir de problème lors de l'exécution.
Autre notation. Au lieu de :
						void TRI(int *TAB, int n); 
						
on écrit quelquefois :
						void TRI(int TAB[], int n); 
					
qui ressemble plus à un tableau. On peut aussi écrire :
						void TRI(int TAB[100], int n); 
					
mais, comme nous l'avons déjà dit, la déclaration de la dimension maximum (ici 100) n'a absolument aucune sorte d'incidence, seule l'adresse du premier élément étant retenue.

Cours, éxercices ou graphismes libre de droit. Un mail est souhaitable | Webmestre : Aublet Bastien (bastien.aublet@hotmail.fr)