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]
"Quelle est la différence entre
char *arr[3];etchar (*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
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.