1,char**
char c = '0';char* p1 = &c; //p1是一个指针变量, 存放的是char类型变量的地址 *p1 = '1'; const char* p2 = &c; //p1是一个指针变量, 存放的是char类型变量的地址, const修饰*, 表示指针内容(*p2)不可变char** p3; //p3是一个指针变量, 存放的是char*类型变量的地址 p3 = &p1; //p3 = &p2; //编译错误, p2是const char*类型的变量, 不能存它的地址
2,const char**
也可以写成char const**,修饰变量类型后的第1个标识符(即:第1个*)
char c = '0';char* p1 = &c; //p1是一个指针变量, 存放的是char类型变量的地址 printf("c_addr:%x, p1:%x\n", &c, p1); *p1 = '1'; const char* p2 = &c; //p1是一个指针变量, 存放的是char类型变量的地址, const修饰*, 表示指针内容(*p2)不可变const char** p3; //p3是一个指针变量, 存放的是const char*类型变量的地址 //p3 = &p1; //编译错误: p1是char*类型的变量, 不能存它的地址 p3 = &p2; *p3 = 0; //修改p2的变量值 printf("p2:%x, p3:%x\n", p2, p3);
3,char*const*
char c = '0';char* p1 = &c; //p1是一个指针变量, 存放的是char类型变量的地址 *p1 = '1'; const char* p2 = &c; //p1是一个指针变量, 存放的是char类型变量的地址, const修饰*, 表示指针内容(*p2)不可变char*const* p3; //p3是一个指针变量, 存放的是char*类型的变量, const修饰第2个*, 表示指针内容(*p3)不可变 p3 = &p1; //p3 = &p2; //编译错误, p2是const char*类型的变量, 不能存它的地址 //*p3 = 0; //编译错误, 指针内容不可变
4,const char*const*
也可以写成char const*const*
char c = '0';char* p1 = &c; //p1是一个指针变量, 存放的是char类型变量的地址 *p1 = '1'; const char* p2 = p1; //p1是一个指针变量, 存放的是char类型变量的地址, const修饰*, 表示指针内容(*p2)不可变const char*const* p3; //p3是一个指针变量, 存放的是const char*类型变量的地址, const修饰第2个*, 表示指针内容(*p3)不可变 p3 = &p1; //p1是char*类型的变量, 没编译错误??? 第2个那边就不行 p3 = &p2; //*p3 = 0; //编译错误, 指针的内容不可变