问:为什么不能向接受const char **的函数传入char **?
答:定理:允许向接受const T的指针的地方传入T型指针,任何类型T都适用。但是,这种允许,也即在被限定的指针类型上轻微不匹配的规则却不能递归应用,只能应用在最上层。由此就可以回答上面的问题了,因为const char **是const char的指针的指针,所以这个规则在这时就不适用了。
const限定词既然存在,就是为了告诉编译器保证不修改const修饰的变量,所以char *赋给const char *是被允许的,而反过来不被允许。显然,使普通指针常数化是安全的,但反之就相当危险了。
验证代码:
1 #include <stdio.h>
2
3 void func_ppc(const char **n){
4 printf("**n = %c\n",**n);
5 }
6
7 void func_pc(const char *m){
8 printf("*m = %c\n",*m);
9 }
10 int main(){
11 char c = 'a';
12 char *pc=&c;
13 char **ppc=&pc;
14 func_ppc(ppc);//note1
15 func_ppc(&pc);//note2
16 func_pc(pc);
17 func_pc(&c);
18 return 1;
19 }
编译报错信息如下:
zzl@SOFT30-46:~/test/test_const$ gcc-g test_const_double.c -o test_const_double
test_const_double.c:In function ‘main’:
test_const_double.c:14:2:warning: passing argument 1 of ‘func_ppc’ fromincompatible pointer type [enabled by default]
test_const_double.c:3:6:note: expected ‘const char **’ but argument is of type‘char **’
test_const_double.c:15:2:warning: passing argument 1 of ‘func_ppc’ fromincompatible pointer type [enabled by default]
test_const_double.c:3:6:note: expected ‘const char **’ but argument is of type‘char **’
结束!