char指针数组和2D数组之间有什么区别?

char指针数组和2D数组之间有什么区别?

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

这两者之间的异同基本相同:

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

第一个原本是只读的。

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

第二,你可以修改,因为你用[]分配它。

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

首先,您可以修改它指向的内容:

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

第二,你不能:

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

表示字符串数组。

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

如果color = byte[3]那么您可以代表您的屏幕监视器

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

是一个2D数组。 如您所见,2D数组可以表示任何内容,包括一个char指针数组(例如多行字符串)。

您可以使用相同的语法访问元素,但有关内存布局的保证会有很大不同。 2darrays是连续的。 指针数组不是。

数组(也称为多维数组)看起来像(在内存中):

 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] 

指针数组看起来像:

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

其中每个槽都是一个指针,可以指向任何一个。 如果它们都碰巧指向每个都有n元素的数组,那么p[i][j]a[i][j]可以在表达式中类似地使用,但它们实际上是完全不同的对象。