Rappelons qu'en C, une chaîne est représentée par un tableau de
caractères terminé par le caractère nul '\0'
; on peut donc
représenter un tableau de chaînes comme une matrice dont les éléments
sont des caractères. Ceci oblige à spécifier la longueur des lignes,
qui doit être la longueur de la plus longue chaîne plus un (pour le
'\0'
final). Par exemple, la liste des dix premiers Turing
awards27 peut être représentée par le tableau bidimensionnel
suivant, à 10 lignes et 16 colonnes :
char turing1[][16] = { "Perlis", "Wilkes", "Hamming", "Minsky", "Wilkinson", "McCarthy", "Dijkstra", "Bachman", "Knuth", "Newell et Simon" };
Dans ce cas, turing1[8] est un tableau de 16 caractères, qui occupe donc 16 octets, mais n'utilise que les 6 premiers pour stocker "Knuth", et non 16 :
Il peut être préférable, pour des raisons d'occupation de la mémoire, de représenter un tableau de chaînes comme un tableau, à une dimension, de pointeurs :
char *turing2[] = { "Perlis", "Wilkes", "Hamming", "Minsky", "Wilkinson", "McCarthy", "Dijkstra", "Bachman", "Knuth", "Newell et Simon" };
L'objet turing2 est différent de l'objet turing1, n'utilisant pas l'espace mémoire de la même façon. La chaîne turing2[8] n'occupe plus maintenant que 6 octets :
Mais on accède toujours aux différents caractères par les mêmes expressions : turing2[8][0], a comme turing1[8][0] pour contenu le caractère 'K'. Ces tableaux de chaînes de caractères sont analogues à la représentation des matrices par des tableaux de pointeurs, à ceci près que les << lignes >> de la matrice n'ont maintenant plus la même taille.