如何在C语言中将二维数组转换类型?

8

最近我的大脑有些混乱,我完全想不起来下面这段C语言代码的作用:

char a[3][3] = { "123", "456", "789" };
char **b = a;

会生成以下警告:

warning: initialization from incompatible pointer type

请有人能为我解释一下这个吗。

谢谢。


2
请注意,因为您截断了\0,所以您声明中的“123”不再是字符串。作为字符串,“123”包含4个字符,而不是3个。 - DReJ
5个回答

10
char (*b)[3] = a;

这里声明了b是一个指向大小为3的字符数组的指针。请注意,这不同于char *b[3],后者声明b为一个有3个字符指针的数组。

还要注意,char *b = a是错误的,并且仍然会发出与char **b = a相同的警告。


1

试试这个,

   char a[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9' }};
   char *b = &a[0][0];

由于a是一个字符数组的数组,您需要将它们初始化为字符。


0

没错。

a 是一个指针。

char *b 定义了一个指向字符的指针。

char **b 定义了一个指向指向字符的指针的指针。


1
a 不是指针;a 是一个数组。不合格的声明 a 是指针是不正确的。 - CB Bailey

0

问题在于 ** 没有静态分配。

您可以使用以下代码实现这个简单版本:

char a[3][3] = {"123", "456", "789"};
char *b[3] = {a[0], a[1], a[2]};

-1

a仍然是指向一个字符的指针:

char* b = a;

没错,就是这样。显然现在太晚了,我不应该写代码。 - stretchkiwi
5
这是不正确的。a会衰变成指向其第一个元素的指针;a是一个包含char[3]元素的数组;指向其第一个元素的指针类型为char (*)[3]而不是char*。这个指针初始化会生成与原代码完全相同的不兼容指针类型警告。 - CB Bailey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接