C 字符指针数组和2D数组之间有什么区别?

C 字符指针数组和2D数组之间有什么区别?,c,arrays,C,Arrays,字符指针数组和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" 首先,您可以修改它指向的

字符指针数组和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!!
表示字符串数组

int my_grid_of_ints[][];
char my_block_of_text[][];
如果
color=byte[3]
则可以表示屏幕监视器

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

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

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

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

指针数组如下所示:

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

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

pasz是如何变成psz的,asz是如何变成sz的?@删除数组的一维
[]
失败了。(
char*[]
char*
char[][]
char[]
这样想要容易得多——它们基本上是一样的,除了在第一个代码片段中,我们还有另一个复杂性维度。出于教学目的,我删除了这种复杂性不是有效的声明,这里的列索引是必需的。了解这一点的一个很好的资源是这样的:在看到muntoo的答案后,我不确定我是否误解了你。如何理解
int my_ints[]二维数组?我的语法错误吗?对不起,我从来没有用过C,只有C++。而且,已经有一段时间了——我已经习惯了C!A
int my_ints[]将是2D。它在C++中是一样的。(我是C++程序员,所以我的C技能也不太好。)这也意味着您可以使用memcpy()和前者的类似函数,但不能在后者上使用。此外,不能在二维数组(数组数组数组)和指针之间强制转换。
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]