当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > const修饰的指针的用法解析
const修饰的指针的用法解析
时间:2016-12-13作者:华清远见

转载请注明出处 :

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

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

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)