ProgrammationDéveloppeur embarqué

Qu'est-ce qu'un tableau de pointeurs en langage C et en quoi cela diffère-t-il d'un pointeur vers un tableau ? Comment déclarer et utiliser correctement chacun de ces types ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Tableau de pointeurs — structure où chaque élément représente un pointeur, généralement du même type. Utilisé, par exemple, pour stocker une liste de chaînes (char *arr[];).

Pointeur vers un tableau — variable stockant l'adresse du début de l'ensemble du tableau (par exemple, int (*ptr)[10]; pointe vers un tableau de 10 éléments int).

Exemples :

// Tableau de pointeurs vers char (tableau de chaînes) char *days[] = {"Sun", "Mon", "Tue"}; // Pointeur vers un tableau de 10 entiers int arr[10]; int (*p)[10] = &arr; // Accès : printf("%s", days[1]); // "Mon" printf("%d", (*p)[0]); // arr[0]

Question piège

"Quelle est la différence entre char *arr[3]; et char (*arr)[3]; et comment accéder correctement aux chaînes dans chaque cas ?"

Beaucoup pensent qu'il n'y a pas de différence ou que ce sont simplement des synonymes.

Réponse correcte :

  • char *arr[3]; — tableau de 3 pointeurs vers char (généralement un tableau de chaînes).
  • char (*arr)[3]; — pointeur vers un tableau de 3 char (pointeur vers une chaîne de caractère unique de longueur 3).
char *arr1[3] = {"a", "bb", "ccc"}; printf("%s", arr1[1]); // bb char str[3] = {'x', 'y', 'z'}; char (*arr2)[3] = &str; printf("%c\n", (*arr2)[2]); // z

Exemples d'erreurs réelles dues à la méconnaissance des subtilités du sujet


Histoire 1

Dans un projet, ils ont levé un tableau de chaînes pour le menu, mais ils ont écrit char menu[5][30]; En le passant dans une fonction comme char *menu, la fonction ne fonctionnait qu'avec la première ligne, les autres étant corrompues ou le programme plantait.


Histoire 2

Ils ont tenté de créer un tableau de pointeurs vers des tableaux : int *arr[10]; initialisés par des boucles, mais en réalité, ils stockaient des pointeurs vers des tableaux locaux, ce qui a provoqué un comportement indéfini lors de l'accès.


Histoire 3

Dans l'implémentation d'une file FIFO pour les tampons, ils ont confondu où prendre l'adresse de toute la file (pointeur vers le tableau) et où prendre l'élément (tableau de pointeurs vers des blocs). En conséquence, les déplacements des pointeurs étaient incorrects — des données étaient perdues.