En C, un tableau de pointeurs est une collection homogène de variables de pointeurs indexées qui font référence à un emplacement mémoire. Il est généralement utilisé en programmation C lorsque nous souhaitons pointer vers plusieurs emplacements mémoire d'un type de données similaire dans notre programme C. Nous pouvons accéder aux données en déréférençant le pointeur pointant vers elles.
Syntaxe:
pointer_type *array_name [array_size];>
Ici,
- pointer_type : Type de données vers lesquelles le pointeur pointe. array_name : Nom du tableau de pointeurs. array_size : taille du tableau de pointeurs.
Note: Il est important de garder à l’esprit la priorité et l’associativité des opérateurs dans le tableau de déclarations de pointeurs de différents types, car un seul changement signifiera une tout autre chose. Par exemple, mettre *array_name entre parenthèses signifiera que array_name est un pointeur vers un tableau.
Exemple:
C
// C program to demonstrate the use of array of pointers> #include> int> main()> {> > // declaring some temp variables> > int> var1 = 10;> > int> var2 = 20;> > int> var3 = 30;> > // array of pointers to integers> > int> * ptr_arr[3] = { &var1, &var2, &var3 };> > // traversing using loop> > for> (> int> i = 0; i <3; i++) {> > printf> (> 'Value of var%d: %d Address: %p
'> , i + 1, *ptr_arr[i], ptr_arr[i]);> > }> > return> 0;> }> |
>
>Sortir
Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c>
Explication:

Comme le montre l’exemple ci-dessus, chaque élément du tableau est un pointeur pointant vers un entier. Nous pouvons accéder à la valeur de ces entiers en sélectionnant d’abord l’élément du tableau, puis en le déréférençant pour obtenir la valeur.
Tableau de pointeurs vers le personnage
L'une des principales applications du tableau de pointeurs consiste à stocker plusieurs chaînes sous forme de tableau de pointeurs vers des caractères. Ici, chaque pointeur du tableau est un pointeur de caractère qui pointe vers le premier caractère de la chaîne.
Syntaxe:
char *array_name [array_size];>
Après cela, nous pouvons attribuer une chaîne de n’importe quelle longueur à ces pointeurs.
Exemple:
C
char> * arr[5]> > = {> 'gfg'> ,> 'geek'> ,> 'Geek'> ,> 'Geeks'> ,> 'techcodeview.com'> }> |
>
>
Cette méthode de stockage de chaînes présente l’avantage du tableau traditionnel de chaînes. Considérez les deux exemples suivants :
Exemple 1:
C
// C Program to print Array of strings without array of pointers> #include> int> main()> {> > char> str[3][10] = {> 'Geek'> ,> 'Geeks'> ,> 'Geekfor'> };> > printf> (> 'String array Elements are:
'> );> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , str[i]);> > }> > return> 0;> }> |
>
>Sortir
String array Elements are: Geek Geeks Geekfor>
Dans le programme ci-dessus, nous avons déclaré les 3 lignes et 10 colonnes de notre tableau de chaînes. Mais en raison de la prédéfinition de la taille du tableau de chaînes, la consommation d'espace du programme augmente si la mémoire n'est pas utilisée correctement ou reste inutilisée. Essayons maintenant de stocker les mêmes chaînes dans un tableau de pointeurs.
Exemple 2 :
C
// C program to illustrate the use of array of pointers to> // characters> #include> int> main()> {> > char> * arr[3] = {> 'geek'> ,> 'Geeks'> ,> 'Geeksfor'> };> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , arr[i]);> > }> > return> 0;> }> |
>
>Sortir
geek Geeks Geeksfor>
Ici, la mémoire totale utilisée est la mémoire nécessaire pour stocker les chaînes et les pointeurs sans laisser d'espace vide, économisant ainsi beaucoup d'espace gaspillé. Nous pouvons comprendre cela en utilisant l’image ci-dessous.

L'espace occupé par le tableau de pointeurs vers des caractères est représenté par des blocs verts pleins excluant la mémoire requise pour stocker le pointeur, tandis que l'espace occupé par le tableau de chaînes comprend à la fois des blocs pleins et vert clair.
Tableau de pointeurs vers différents types
Non seulement nous pouvons définir le tableau de pointeurs pour les types de données de base comme int, char, float, etc. mais nous pouvons également les définir pour les types de données dérivés et définis par l'utilisateur tels que les tableaux, les structures, etc. Considérons l'exemple ci-dessous où nous créons un tableau de pointeurs pointant vers une fonction pour effectuer les différentes opérations.
Exemple:
C
// C program to illustrate the use of array of pointers to> // function> #include> // some basic arithmetic operations> void> add(> int> a,> int> b) {> > printf> (> 'Sum : %d
'> , a + b);> }> void> subtract(> int> a,> int> b) {> > printf> (> 'Difference : %d
'> , a - b);> }> void> multiply(> int> a,> int> b) {> > printf> (> 'Product : %d
'> , a * b);> }> void> divide(> int> a,> int> b) {> > printf> (> 'Quotient : %d'> , a / b);> }> int> main() {> > int> x = 50, y = 5;> > // array of pointers to function of return type int> > void> (*arr[4])(> int> ,> int> )> > = { &add, &subtract, &multiply, ÷ };> > for> (> int> i = 0; i <4; i++) {> > arr[i](x, y);> > }> > return> 0;> }> |
>
entreprise contre entreprise
>Sortir
Sum : 55 Difference : 45 Product : 250 Quotient : 10>
Application du tableau de pointeurs
Un ensemble de pointeurs est utile dans un large éventail de cas. Certaines de ces applications sont répertoriées ci-dessous :
- Il est le plus souvent utilisé pour stocker plusieurs chaînes.
- Il est également utilisé pour implémenter LinkedHashMap en C et également dans la technique de chaînage de résolution de collisions en hachage.
- Il est utilisé dans les algorithmes de tri comme le tri par compartiment.
- Il peut être utilisé avec n’importe quel type de pointeur, il est donc utile lorsque nous avons des déclarations distinctes de plusieurs entités et que nous souhaitons les stocker au même endroit.
Inconvénients du tableau de pointeurs
La gamme de pointeurs présente également son lot d’inconvénients et doit être utilisée lorsque les avantages l’emportent sur les inconvénients. Certains des inconvénients du tableau de pointeurs sont :
- Consommation de mémoire plus élevée : un tableau de pointeurs nécessite plus de mémoire que les tableaux simples en raison de l'espace supplémentaire requis pour stocker les pointeurs. Complexité : un tableau de pointeurs peut être complexe à utiliser par rapport à un tableau simple. Sujet aux bugs : comme nous utilisons des pointeurs, tous les bugs associés aux pointeurs l'accompagnent, nous devons donc les gérer avec soin.
Article associé: Pointeur vers un tableau | Pointeur de tableau