Comme une chaîne est une tableau de caractères, on peut représenter un tableau de chaînes comme un tableau de caractères à deux dimensions. Ceci oblige à spécifier la longueur des lignes, qui doit être la longueur de la plus longue chaîne plus un. Par exemple, la liste des premiers Turing awards peut être représentée par le tableau bidimensionnel suivant :
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" :
Il est 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.