C“警告:从不兼容的指针类型初始化”当函数有一个数组作为参数时

C“警告:从不兼容的指针类型初始化”当函数有一个数组作为参数时,c,arrays,pointers,function-pointers,C,Arrays,Pointers,Function Pointers,我正在尝试让指针函数数组工作。但是,我注意到,当函数的一个参数是数组类型时,会出现一个错误。我不知道为什么我总是出错 错误消息 warning: initialization from incompatible pointer type [-Wincompatible-pointer-types] void (*p[1])(int, int, int) = { mini }; 代码 谢谢大家! 函数指针有const int,函数指针有int[][],这两个值不一样。您必须改为使用常量int*

我正在尝试让指针函数数组工作。但是,我注意到,当函数的一个参数是数组类型时,会出现一个错误。我不知道为什么我总是出错

错误消息

warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
 void (*p[1])(int, int, int) = { mini };
代码

谢谢大家!

函数指针有const int,函数指针有int[][],这两个值不一样。您必须改为使用常量int*[]

如果正确地将void*p[1]int,int,const int声明为:

函数指针有const int,函数指针有int[][],这两个值不同。您必须改为使用常量int*[]

如果正确地将void*p[1]int,int,const int声明为:


您试图声明为数组元素类型目标的函数类型的第三个参数是一个二维可变长度的常量int数组。但是,在数组声明中,您试图将其声明为单个常量int。这两个参数不兼容

最清晰的声明方式如下:

void(*p[1])(int, int, const int[*][*]) = { min };
void(*p[1])(int, int, const int[][*]) = { min };
或者像这样:

void(*p[1])(int, int, const int[*][*]) = { min };
void(*p[1])(int, int, const int[][*]) = { min };

。两者是等价的。数组维度中的*表示大小未知的VLA-未知,因为它依赖于其他参数。数组参数的第一个维度总是可以忽略的,通常我更喜欢忽略它,但在这种情况下我更喜欢第一个声明,因为即使编译器忽略了第一个数组维度,人类读者也很清楚这一点,是一个可变维度。

您试图声明为数组元素类型目标的函数类型的第三个参数是常数int的2D可变长度数组。但是,在数组声明中,您试图将其声明为单个常数int。这些参数不兼容

最清晰的声明方式如下:

void(*p[1])(int, int, const int[*][*]) = { min };
void(*p[1])(int, int, const int[][*]) = { min };
或者像这样:

void(*p[1])(int, int, const int[*][*]) = { min };
void(*p[1])(int, int, const int[][*]) = { min };

。两者是等价的。数组维度中的*表示大小未知的VLA-未知,因为它依赖于其他参数。数组参数的第一个维度总是可以忽略的,通常我更喜欢忽略它,但在这种情况下我更喜欢第一个声明,因为即使编译器忽略了第一个数组维度,人类读者也很清楚这一点,是一个变量维度。

编译器发出此警告消息,因为您正试图用void int,int,const int*[col]类型的min初始化void*int,int,const int类型的数组指针p的第一个成员。检查两种类型的第三个参数的差异

要修复此警告消息,您可以执行以下操作:

void(*p[1])(int row, int col, const int arr[row][col]) = {min};
此外,如果数组只包含一个成员,则不需要函数指针数组。在这种情况下,您可以简单地执行以下操作:

void(*p)(int row, int col, const int arr[row][col]) = min;

编译器发出此警告消息是因为您试图用void int,int,const int*[col]类型的min初始化void*int,int,const int类型的数组指针p的第一个成员。检查两种类型的第三个参数的差异

要修复此警告消息,您可以执行以下操作:

void(*p[1])(int row, int col, const int arr[row][col]) = {min};
此外,如果数组只包含一个成员,则不需要函数指针数组。在这种情况下,您可以简单地执行以下操作:

void(*p)(int row, int col, const int arr[row][col]) = min;


您的代码有不平衡的括号。修复它们。它们现在都修复了。min的第三个参数是数组。您试图存储的函数指针的第三个参数是const int。它们不相同。我为您删除了[c++ ]标签,因为min的声明是有效的C++但无效C++。@ fSimaTrxx查看应答代码有不平衡的括号。修复它们。它们现在都修复了。min的第三个参数是数组。您试图存储的函数指针的第三个参数是const int。它们不相同。我为您删除了[c++ ]标签,因为min的声明是有效的C++但无效C++。answer@Roflcopter4OP在他们的问题中有一个数组。你会如何建议编辑?这似乎很挑剔。@CIsForCookies这对我来说很好@Roflcopter4以你的方式做事的原因是什么?我的方式怎么了?这似乎是一种偏好选择。我这样做是因为我一开始就是这么想的。仅此而已。记录在案,const int*[]和const int[*][*]以及const int[][*]和const int*[*]之间只有一点实际差异。第一个是指向与函数的实际参数类型兼容的不完整数组类型的指针。它也可以在函数参数列表之外使用。其他三个只能在函数的参数列表中使用,在这种情况下,它们各自声明一个指向未指定维度的VLA的指针,尽管如此,这是一个完整的类型。@JohnBollinger似乎是时候让我在这里下结论了。你说得对,它们是完全不同的类型。我为我的无知向大家道歉。现在我要做的就是弄清楚上帝的旨意
名称实际上被传递到一个VLA类型的参数中。@Roflcopter4好吧,OP在他们的问题中有一个数组。你会如何建议编辑?这似乎很挑剔。@CIsForCookies这对我来说很好@Roflcopter4以你的方式做事的原因是什么?我的方式怎么了?这似乎是一种偏好选择。我这样做是因为我一开始就是这么想的。仅此而已。记录在案,const int*[]和const int[*][*]以及const int[][*]和const int*[*]之间只有一点实际差异。第一个是指向与函数的实际参数类型兼容的不完整数组类型的指针。它也可以在函数参数列表之外使用。其他三个只能在函数的参数列表中使用,在这种情况下,它们各自声明一个指向未指定维度的VLA的指针,尽管如此,这是一个完整的类型。@JohnBollinger似乎是时候让我在这里下结论了。你说得对,它们是完全不同的类型。我为我的无知向大家道歉。现在我所要做的就是弄清楚到底是什么东西被传递到了一个VLA类型的参数中。是不是任何实际的参数都会被传递为const int**-一个双指针?我从来没有听说过函数可以像参数一样接收数组。没有,@Roflcopter4。传递的参数将是指向数组的指针,它与双指针完全不同。你可以在其他地方找到很多关于这方面的问题。复制min的参数也可以:void*p[1]int row,int col,const int arr[row][col]={min};。对某些人来说,这可能更容易理解,但可能会产生误导。您认为这个@JohnBollinger有什么问题吗?是不是任何实际参数都将作为const int**(双指针)传递?我从来没有听说过函数可以像参数一样接收数组。没有,@Roflcopter4。传递的参数将是指向数组的指针,它与双指针完全不同。你可以在其他地方找到很多关于这方面的问题。复制min的参数也可以:void*p[1]int row,int col,const int arr[row][col]={min};。对某些人来说,这可能更容易理解,但可能会产生误导。你觉得这个@JohnBollinger有什么问题吗?