转载请注明出处 :
//www.cnblogs.com/sirius-xu/diary/2013/03/08/2949199.html
**********************************************************************************************************************************
const修饰的指针的用法解析
今天看到了三个用const修饰的二级指针const char **p; char *const *p以及char **const p;由于我对这几个还不太熟悉,所以打算用一个测试程序来试试他们的作用, 顺便对const修饰的一级指针也探讨一下.
下面是我本次测试的程序 :
#include
int main(int argc, const char *argv[])
{
char a1[2] = { 15,25 };
char a2[2][3] = { 10, 20, 30, 50, 60, 70};
const char *p1;
char *const p2 = a1; //p2只能在定义的时候进行初始化
char const *p3; //跟"const char *p1"一样
char *p4;
const char **p11;
char *const *p22; //指向"char *const"的指针
char **const p33 = &p4; //只能在定义的时候进行初始化
p1 = a1;
//p2 = a1; //出错,不能向只读变量赋值
p3 = a1;
p4 = a1;
*p1 ++;
//(*p1) ++; //错误: 令只读位置'*p1'自增
*p3 ++;
//(*p3) ++; //错误: 令只读位置'*p3'自增
//*p2 ++; //出错,令只读变量自增
(*p2) ++;
printf("*p1 = %d\n", *p1); //25
printf("*p3 = %d\n", *p3); //25
printf("*p2 = %d\n", *p2); //16
p1 = a2[0];
p11 = &p1;
printf("**p11 = %d\n", **p11); //10
(*p2) ++;
**p11 ++; //*(*p11 ++);
//*p11 指向p1的下一个地址, 即 p2
printf("**p11 = %d\n", **p11); //17
*(*p11)++;
printf("**p11 = %d\n", **p11);
//(**p11) ++; //错误: 令只读位置'**p11'自增
p22 = &p2;
printf("**p22 = %d\n", **p22);
(**p22) ++;
printf("**p22 = %d\n", **p22);
//*(*p22) ++; //错误: 令只读位置'*p22'自增
**(p22 ++);
printf("**p22 = %d\n", **p22);
//p33 = &p4; //错误: 向只读变量'p33'赋值
(**p33) ++;
printf("**p33 = %d\n", **p33);
*(*p33) ++;
printf("**p33 = %d\n", **p33);
return 0;
}
上面这个例子我就用了两个简单的数组来测试, 由这个例子我们可以明显地看出:
const char *p1 与char const *p3功能一样, 都是"p的指向可以被改变, 但是p所指向的内容不能被改变"
char *const p2 的作用是"p2的指向不能被改变, 只能在定义的时候进行初始化, 但p2的值可以被改变"
char **const p11其实就是指向"const char *"的指针, (*p11)的值即(p1)的值, 所以也是不能改变的, 但是p11的指向可以被改变
char *const *p22是指向"char * const "的指针, (*p22)的值即(p2)的值有一样的特性, 但是p22的指向可以被改变
char **const p33是指向"char const "类型的指针, 它只能在定义的时候进行初始化, 他的指向不可以被改变, (*p33)即p4, 其指向以及所指向的值都是可以改变的.
以上只是个人见解, 因能力有限, 不足之处还请谅解.