例一:
#include <stdio.h>
void fun(
const
char **p){}
int main(int argc, char **argv)
{
fun(argv);
return 0;
}
编译会报错:fun()函数实参类型与形参类型不匹配。
char **p1; // p1指向变量类型是char *
const char **p2; // p2指向变量类型是const char *,在这里,const是类型的一部分。
故:p1和p2指向的类型不一样,不能把p1赋值给p2。
但编译器允许这样:
char *p1;
const char *p2;
p2 = p1;
也就是说当且仅当为一级指针的时候,编译器允许将char *类型的指针赋给const char *类型的指针。
当进入二级关系时,如下代码:
const char **pp;
char *p;
pp = &p; // 是错误的。pp类型是const char **,&p类型是char **。
假设上面这行代码是正确的,则如下代码:
const char a = 10;
*pp = &a;
*p = 20; // 就把const char类型的变量a的值改变了
例二:
#include <stdio.h>
void fun(char *const*p){}
int main(int argc, char **argv)
{
fun(argv);
return 0;
}
编译则不会有错。
char **p1; // p1指向变量类型是char *
char *
const
*p2; // p2指向变量类型是char *
const,在这里,const是一个限定符,而不是类型的一部分。
故:p1和p2指向的类型不一样(都是char *),所以可以把p1赋值给p2。