Arrays C、 GCC警告:从不兼容的指针类型初始化

Arrays C、 GCC警告:从不兼容的指针类型初始化,arrays,c,pointers,initialization,Arrays,C,Pointers,Initialization,有人能帮忙吗?这部分代码不正确的地方是**strings==strings[0][0],strings[0][0]不是char吗?对不起,我的英语真的很差。编译器认识到字符串是数组的数组,因此建议相应地声明指针: char strings[10][100], ** ptr = strings; 更新: 如David C.Rankin所述,转换发生在ptr的初始化过程中字符串从100个字符的数组转换为指向该数组第一个元素的100个字符数组指针。此处指定了转换:。警告: char strings[

有人能帮忙吗?这部分代码不正确的地方是**strings==strings[0][0],strings[0][0]不是char吗?对不起,我的英语真的很差。

编译器认识到
字符串是数组的数组,因此建议相应地声明指针:

char strings[10][100], ** ptr = strings;
更新: 如David C.Rankin所述,转换发生在
ptr
的初始化过程中<代码>字符串
从100个字符的数组转换为指向该数组第一个元素的100个字符数组指针。此处指定了转换:。

警告:

char strings[10][100], (*ptr)[100] = strings;

它说:ptr和string是不同的类型,所以ptr[0][0]和string[0][0]是不同的

嗯,是的,
char(*)[100]
并不等同于
char**
。所以
char strings[10][100],(*ptr)[100]=strings;
完整的解释提示:
char a[n]
char a[n][m]之间有很大的区别
。一个是指针数组,另一个是数组数组。2D数组被分配为连续块,但指向其他数组的指针数组通常不是。这将有助于解释数组到指针的转换以及作为转换源的引用。你是对的。谢谢你的链接,我相应地更新了我的答案。But如果我使用这个声明,我就不能使用我代码的这一部分:(fgets(*(ptr+ct),99,stdin);//int类型的ct。我如何用这样的声明填充数组的所有行呢?你可以,
fgets(ptr[ct],100,stdin)
很好。注意,
fgets()
你不能减去1,
fgets(ptr[ct],100,stdin)
是正确的。其中
0,但在本例中,我得到错误:数组的使用无效,未指定边界。如果我将执行char(*ptr)[100]=strings;而不是char(*ptr)[]=strings,我可以修复它;但如果我不知道数组的大小,我应该怎么做(我在函数中使用它)。但字符串是数组,数组的名称是第一个元素上的指针。在我的例子中,字符串==&string[0];字符串[0]==&string[0][0]因此字符串==&string[0][0]因此**字符串==string[0][0]因此字符串的类型是char**。它有什么问题吗?要测试代码,我使用:
int main(int argc,string argv[]){char strings[10][100],**ptr=strings;printf(“%s\n”,strings);if(strings[0][0]==ptr[0][0])printf(“相同”);else printf(“不相同”);return 0;}
这里:它打印的内容不一样,但如果我改为“
char strings[10][100]”,(*ptr)[100]=strings;
它返回的内容相同,因为存在相同的类型
Warning: initialization of ‘char **’ from incompatible pointer type ‘char (*)[100]’ [-Wincompatible-pointer-types]
    8 |   char strings[10][100], ** ptr = strings;