const修饰的指针的用法解析

Posted on 2013-03-08 09:24  sirius_xu  阅读(388)  评论(0)    收藏  举报

*****************************************************************

转载请注明出处 :

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, 其指向以及所指向的值都是可以改变的.

 

以上只是个人见解, 因能力有限, 不足之处还请谅解.

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3