最近我的大脑有些混乱,我完全想不起来下面这段C语言代码的作用:
char a[3][3] = { "123", "456", "789" };
char **b = a;
会生成以下警告:
warning: initialization from incompatible pointer type
请有人能为我解释一下这个吗。
谢谢。
最近我的大脑有些混乱,我完全想不起来下面这段C语言代码的作用:
char a[3][3] = { "123", "456", "789" };
char **b = a;
会生成以下警告:
warning: initialization from incompatible pointer type
请有人能为我解释一下这个吗。
谢谢。
char (*b)[3] = a;
这里声明了b
是一个指向大小为3的字符数组的指针。请注意,这不同于char *b[3]
,后者声明b
为一个有3个字符指针的数组。
还要注意,char *b = a
是错误的,并且仍然会发出与char **b = a
相同的警告。
试试这个,
char a[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9' }};
char *b = &a[0][0];
由于a是一个字符数组的数组,您需要将它们初始化为字符。
没错。
a
是一个指针。
char *b
定义了一个指向字符的指针。
char **b
定义了一个指向指向字符的指针的指针。
a
不是指针;a
是一个数组。不合格的声明 a
是指针是不正确的。 - CB Bailey问题在于 ** 没有静态分配。
您可以使用以下代码实现这个简单版本:
char a[3][3] = {"123", "456", "789"};
char *b[3] = {a[0], a[1], a[2]};
a
仍然是指向一个字符的指针:
char* b = a;
a
会衰变成指向其第一个元素的指针;a
是一个包含char[3]
元素的数组;指向其第一个元素的指针类型为char (*)[3]
而不是char*
。这个指针初始化会生成与原代码完全相同的不兼容指针类型警告。 - CB Bailey