C &引用;警告:来自不兼容指针类型的赋值;使用双指针时

C &引用;警告:来自不兼容指针类型的赋值;使用双指针时,c,pointers,warnings,compiler-warnings,C,Pointers,Warnings,Compiler Warnings,我对警告“来自不兼容指针类型的赋值”有疑问。为什么下面的代码 const char files[][128]={"file1","file2","file3"}; char **ptr; ptr=files; 发出这个警告?一些更复杂的东西正在发挥作用: typedef struct { double **matrix; }foo_struct; void fun(foo_struct *foo) { double **ptr; ptr=(*foo).matrix; } 所以我真的不明白

我对警告“来自不兼容指针类型的赋值”有疑问。为什么下面的代码

const char files[][128]={"file1","file2","file3"};
char **ptr;

ptr=files;
发出这个警告?一些更复杂的东西正在发挥作用:

typedef struct
{
double **matrix;
}foo_struct;

void fun(foo_struct *foo)
{
double **ptr;
ptr=(*foo).matrix;
}
所以我真的不明白为什么第一个会给出这样的警告,因为我认为类似files[][128]的东西与char**ptr的类型相同。我看到的唯一区别是C知道有效内存区域的跨度/大小,而在第二个示例中它不知道

这里有一些类似的东西,但对我没有帮助:


谢谢你的帮助

文件
的类型为
char(*)[128]
,而不是
char**
;没有第二级指针(我们现在还不是在谈论
const
;它是另一种蠕虫)

此代码不应显示警告(constness除外)


文件
的类型为
char(*)[128]
,而不是
char**
;没有第二级指针(我们现在还不是在谈论
const
;它是另一种蠕虫)

此代码不应显示警告(constness除外)


这与以下事实有关:

const char files[][128]={"file1","file2","file3"};
使
文件
的类型为
const char[][128]
,相当于类型为
const char(*)[128]

在这种情况下,数据以每个字符串128个字符的块进行布局。取消引用
文件
会找到一个包含128个字符的块

相反,
char**
期望在解引用时找到指向char的
char*
指针数组。如果希望
文件
char**
兼容,则必须将其声明为

const char * files[]={"file1","file2","file3"};

这与以下事实有关:

const char files[][128]={"file1","file2","file3"};
使
文件
的类型为
const char[][128]
,相当于类型为
const char(*)[128]

在这种情况下,数据以每个字符串128个字符的块进行布局。取消引用
文件
会找到一个包含128个字符的块

相反,
char**
期望在解引用时找到指向char的
char*
指针数组。如果希望
文件
char**
兼容,则必须将其声明为

const char * files[]={"file1","file2","file3"};

已经被问过很多次了。可能的副本已被多次询问。可能重复的这样声明会给出完全相同的警告这样声明会给出完全相同的警告