Quelles sont les différences entre un tableau de pointeurs de caractères et un tableau 2D?

Quelles sont les différences entre un tableau de pointeurs de caractères et un tableau 2D?

 char* pasz[3] = {"abc", "def", "ghi"}; char asz[3][] = {"abc", "def", "ghi"}; 

Les similitudes et les différences sont fondamentalement les mêmes qu’entre ces deux:

 char *psz = "jkl"; char sz[] = "jkl"; 

Le premier est à l’ origine en lecture seule.

 psz[0] = 'a'; // Illegal!! 

La seconde, vous pouvez modifier, puisque vous l’allouez avec le [] .

 sz[0] = 'b'; // sz == "bkl" 

Le premier, vous pouvez modifier ce qu’il pointe vers:

 char mysz[] = "abc"; psz = mysz; psz[0] = 'b'; // mysz == "bbc" 

La seconde, vous ne pouvez pas:

 sz = mysz; // Can't assign an array to an array!! 
 char* my_ssortingng[]; 

représente un tableau de chaînes.

 int my_grid_of_ints[][]; char my_block_of_text[][]; 

Si color = byte[3] vous pouvez représenter votre moniteur à l’écran.

 color my_pixel_buffer[][] = new color[768][1024]; 

est un tableau 2D. Comme vous pouvez le constater, un tableau 2D peut représenter n’importe quoi, y compris un tableau de pointeurs de caractères (tels que plusieurs lignes de chaînes).

Vous pouvez accéder aux éléments avec la même syntaxe, mais les garanties relatives à la disposition de la mémoire sont très différentes. Le tableau 2D est contigu. Le tableau de pointeurs ne l’est pas.

Un tableau de tableaux (ou tableau multidimensionnel) ressemble à (en mémoire):

 a[0][0], a[0][1], a[0][n-1], a[1][0], a[1][1], ..., a[1][n-1], ..., a[m-1][n-1] 

tableau de pointeurs ressemble à:

 p[0], p[1], ..., p[m-1] 

où chaque emplacement est un pointeur et peut pointer n’importe quoi. S’ils arrivent tous à pointer sur des tableaux de n éléments, p[i][j] et a[i][j] peuvent être utilisés de la même manière dans les expressions, mais ce sont en fait des objects très différents.