*****************************************************************
转载请注明出处 :
http://www.cnblogs.com/sirius-xu/archive/2013/03/08/2949244.html
*****************************************************************
const修饰的指针的用法解析
今天看到了三个用const修饰的二级指针const char **p; char *const *p以及char **const p;由于我对这几个还不太熟悉,所以打算用一个测试程序来试试他们的作用, 顺便对const修饰的一级指针也探讨一下.
下面是我本次测试的程序 :
1 #include <stdio.h> 2 int main(int argc, const char *argv[]) 3 { 4 char a1[2] = { 15,25 }; 5 char a2[2][3] = { 10, 20, 30, 50, 60, 70}; 6 const char *p1; 7 char *const p2 = a1; //p2只能在定义的时候进行初始化 8 char const *p3; //跟"const char *p1"一样 9 char *p4; 10 const char **p11; 11 char *const *p22; //指向"char *const"的指针 12 char **const p33 = &p4; //只能在定义的时候进行初始化 13 14 p1 = a1; 15 //p2 = a1; //出错,不能向只读变量赋值 16 p3 = a1; 17 p4 = a1; 18 19 20 *p1 ++; 21 //(*p1) ++; //错误: 令只读位置‘*p1’自增 22 *p3 ++; 23 //(*p3) ++; //错误: 令只读位置‘*p3’自增 24 //*p2 ++; //出错,令只读变量自增 25 (*p2) ++; 26 printf("*p1 = %d\n", *p1); //25 27 printf("*p3 = %d\n", *p3); //25 28 printf("*p2 = %d\n", *p2); //16 29 p1 = a2[0]; 30 p11 = &p1; 31 printf("**p11 = %d\n", **p11); //10 32 (*p2) ++; 33 **p11 ++; //*(*p11 ++); 34 //*p11 指向p1的下一个地址, 即 p2 35 printf("**p11 = %d\n", **p11); //17 36 *(*p11)++; 37 printf("**p11 = %d\n", **p11); 38 //(**p11) ++; //错误: 令只读位置‘**p11’自增 39 p22 = &p2; 40 printf("**p22 = %d\n", **p22); 41 (**p22) ++; 42 printf("**p22 = %d\n", **p22); 43 //*(*p22) ++; //错误: 令只读位置‘*p22’自增 44 **(p22 ++); 45 printf("**p22 = %d\n", **p22); 46 //p33 = &p4; //错误: 向只读变量‘p33’赋值 47 (**p33) ++; 48 printf("**p33 = %d\n", **p33); 49 *(*p33) ++; 50 printf("**p33 = %d\n", **p33); 51 return 0; 52 }
上面这个例子我就用了两个简单的数组来测试, 由这个例子我们可以明显地看出:
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, 其指向以及所指向的值都是可以改变的.
以上只是个人见解, 因能力有限, 不足之处还请谅解.
浙公网安备 33010602011771号