© Éditions Eyrolles
141
chapitre n° 7
Les tableaux et les pointeurs
Notre fonction reçoit donc, en premier argument, l’adresse du premier élément du tableau,
sous forme d’un pointeur de type int *. Ici, nous avons tenu compte de ce que deux éléments
consécutifs de la diagonale sont séparés par n éléments. Si, donc, un pointeur désigne un
élément de la diagonale, pour pointer sur le suivant il suffit d’incrémenter ce pointeur de n+1
unités (l’unité étant ici la taille d’un entier).
Un appel de notre fonction diag se présentera ainsi :
int t[30] [30] ;
diag (t, 30)
Or l’argument effectif t est, certes, l’adresse de t, mais d’un type pointeur sur des blocs de
10 entiers et non pointeur sur des entiers. En fait, la présence d’un prototype pour diag fera
qu’il sera converti en un int *. Ici, il n’y a aucun risque de modification d’adresse liée à des
contraintes d’alignement, car on passe de l’adresse d’un objet de taille 10n à l’adresse d’un
objet de taille n. Il n’en irait pas de même avec la conversion inverse.
Cette fonction pourrait également s’écrire en y déclarant un tableau à une seule dimension
dont la taille (n*n) devrait alors être fournie en argument (en plus de n). Le même mécanisme
d’incrémentation de n+1 s’appliquerait alors, non plus à un pointeur, mais à la valeur d’un
indice.
9 Utilisation de pointeurs sur des fonctions
En C, comme dans la plupart des autres langages, il n’est pas possible de placer le nom d’une
fonction dans une variable. En revanche, on peut y définir une variable destinée à pointer sur
une fonction, c’est-à-dire à contenir son adresse.
De plus, en C, le nom d’une fonction (employé seul) est traduit par le compilateur en l’adresse
de cette fonction. On retrouve là quelque chose d’analogue à ce qui se passait pour les noms de
tableaux, avec toutefois cette différence que les noms de fonctions sont externes (ils subsisteront dans les modules objet).
Ces deux remarques offrent en C des possibilités intéressantes. En voici deux exemples.
9.1 Paramétrage d’appel de fonctions
Considérez cette déclaration :
int (* adf) (double, int) ;
Elle spécifie que :
(* adf) est une fonction à deux arguments (de type double et int) fournissant un
résultat de type int,
Delannoy Livre.book Page 141 Mercredi, 6. mai 2009 4:26 16
141
chapitre n° 7
Les tableaux et les pointeurs
Notre fonction reçoit donc, en premier argument, l’adresse du premier élément du tableau,
sous forme d’un pointeur de type int *. Ici, nous avons tenu compte de ce que deux éléments
consécutifs de la diagonale sont séparés par n éléments. Si, donc, un pointeur désigne un
élément de la diagonale, pour pointer sur le suivant il suffit d’incrémenter ce pointeur de n+1
unités (l’unité étant ici la taille d’un entier).
Un appel de notre fonction diag se présentera ainsi :
int t[30] [30] ;
diag (t, 30)
Or l’argument effectif t est, certes, l’adresse de t, mais d’un type pointeur sur des blocs de
10 entiers et non pointeur sur des entiers. En fait, la présence d’un prototype pour diag fera
qu’il sera converti en un int *. Ici, il n’y a aucun risque de modification d’adresse liée à des
contraintes d’alignement, car on passe de l’adresse d’un objet de taille 10n à l’adresse d’un
objet de taille n. Il n’en irait pas de même avec la conversion inverse.
Cette fonction pourrait également s’écrire en y déclarant un tableau à une seule dimension
dont la taille (n*n) devrait alors être fournie en argument (en plus de n). Le même mécanisme
d’incrémentation de n+1 s’appliquerait alors, non plus à un pointeur, mais à la valeur d’un
indice.
9 Utilisation de pointeurs sur des fonctions
En C, comme dans la plupart des autres langages, il n’est pas possible de placer le nom d’une
fonction dans une variable. En revanche, on peut y définir une variable destinée à pointer sur
une fonction, c’est-à-dire à contenir son adresse.
De plus, en C, le nom d’une fonction (employé seul) est traduit par le compilateur en l’adresse
de cette fonction. On retrouve là quelque chose d’analogue à ce qui se passait pour les noms de
tableaux, avec toutefois cette différence que les noms de fonctions sont externes (ils subsisteront dans les modules objet).
Ces deux remarques offrent en C des possibilités intéressantes. En voici deux exemples.
9.1 Paramétrage d’appel de fonctions
Considérez cette déclaration :
int (* adf) (double, int) ;
Elle spécifie que :
(* adf) est une fonction à deux arguments (de type double et int) fournissant un
résultat de type int,
Delannoy Livre.book Page 141 Mercredi, 6. mai 2009 4:26 16
