我的理解是
char (*)[20]
是pointer to an array of 20 non-const chars,而
const char (*)[20]
是指向20个 const chars 的数组的指针。
在下面的代码中,我将一个指向非const chars 数组的指针传递给一个函数,该函数需要一个指向 const chars 数组的指针。在函数内部,编译器正确捕获对数组的写访问,如预期的那样:
#include <stdlib.h>
void f(const char (*param)[20]) {
/* correctly catched by the compiler: assignment of read-only location '(*param)[2]' */
/* (*param)[2] = 'A'; */
}
int main() {
char (*data)[20] = calloc(20, 1);
f(data);
return 0;
}
但是,我在函数调用时收到以下警告:
$ gcc -Wall -pedantic -o so so.c
so.c: In function 'main':
so.c:15:4: warning: passing argument 1 of 'f' from incompatible pointer type [enabled by default]
f(data);
^
so.c:3:6: note: expected 'const char (*)[20]' but argument is of type 'char (*)[20]'
void f(const char (*param)[20]) {
^
为什么?是不是总能将指向非常量数据的指针传递给需要相同类型的指向const数据的函数?
我知道这有other solutions,但我特别感兴趣的是理解为什么编译器会在这种特定情况下发出警告。