C++中指针常量与常量指针的区别

在C++学习过程使用中,每个人都不可避免的会把指针错误理解或在不理解,尤其是对指针常量和常量指针的理解,特别容易把概念搞混淆。本文就针对该问题简单的说说指针常量和常量指针的区别。

指针常量

本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。

特征:
  • 是个常量。
  • 指针锁保存的地址可以改变,但指针指向的值不能改变。
  • 指针本身是常量,指向的地址不可以变,但指向的地址所对应的内容可以变。

形式如下:

int* const p;

常量指针

常量指针又叫常指针,可以理解为常量的指针,也就是这个是指针,但指向的是常量,这个常量是指针的值(地址),并不是地址指向的值。

特征:
  • 常量指针指向的对象不能通过这个指针来修改,可以通过原来的声明修改。
  • 常量指针可以被赋值为变量的地址,之所以叫常量指针,就是限制了通过这个指针修改变量的值。
  • 指针还可以指向别处,因为指针本身只是一个变量,可以指向任意地址。

形式如下:

int const* p;
const int* p;

指向常量的常指针

指向常量的指针常量是一个常量,且所指向的对象也是一个常量。

特征
  • 一个指针常量,指向的是一个指针对象;
  • 它所指向的指针对象且是一个常量,即指向的对象不能变。

形式如下:

const int* const p;

如何区别这些呢?

区分宝典

方式一

看*和const的排列顺序,如下:

    int const* p;  //const* 常量指针
    const int* p;  //const* 常量指针
    int* const p;  //*const 指针常量
方式二

看const离谁近,即从右往左看,如下:

    int cont* p;  //const修饰的是*p,即*p的内容不可通过p改变,但p不是const,p可以修改,*p不可修改。
    const int* p; //和上面一样
    int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p可以修改

看一个实例

    //-------常量指针-------
    const int *p1 = &a;
    a = 300;     //OK,仍然可以通过原来的声明修改值,
    //*p1 = 56;  //Error,*p1是const int的,不可修改,即常量指针不可修改其指向地址
    p1 = &b;     //OK,指针还可以指向别处,因为指针只是个变量,可以随意指向;

    //-------指针常量-------//
    int*  const p2 = &a;
    a = 500;     //OK,仍然可以通过原来的声明修改值,
    *p2 = 400;   //OK,指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
    //p2 = &b;     //Error,因为p2是const 指针,因此不能改变p2指向的内容
    
    //-------指向常量的常量指针-------//
    const int* const p3 = &a;
    //*p3 = 1;    //Error
    //p3 = &b;    //Error
    a = 5000;    //OK,仍然可以通过原来的声明修改值

在实际应用中,常量指针要比指针常量用的多,比如常量指针经常用在函数传参中,以避免函数内部修改内容。

size_t strlen(const char* src); //常量指针,src的值不可改变;
char a[] = "hello";
char b[] = "world";
size_t a1 = strlen(a);
size_t b1 = strlen(b);

虽然a、b是可以修改的,但是可以保证在strlen函数内部不会修改a、b的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值