指针和const限定

本文详细介绍了const指针的三种形式:指向const对象的const指针、const指针以及指向const对象的指针。分别阐述了它们的定义、特点以及使用场景,并通过实例说明了它们之间的区别和注意事项,包括赋值限制和对象修改权限。重点强调了const指针在函数参数中的应用,用于保护实参对象不被修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


【1】指向const对象的const指针
    可以定义指向const对象的const指针,形式为:
     const 指向类型 * const 指针变量名;
    例如
    const double pi = 3.14159;
    const double * const p = π //p为指向const对象的const指针。
    程序中,既不能修改 p 所指向对象的值,也不能修改该指针 p 的指向(即p中存在的地址值)可以从右至左理解上述定义:“p首先是一个const指针,它指向double类型的const对象”
   
【2】const指针 
    一个指针变量可以是只读的,称为const指针,定义形式为
    指向类型 * const 指针变量名;
    例如
    int a =10,b =20;
    int * const p =&a;  //p是const指针     可以从右向左把上述定义语句理解为“p是指向int型对象的const指针”,与其他const变量一样,const指针的值不能改变,这就意味着不能使p再被赋值指向其他对象。任何试图给const指针赋值的操作,即使是给p赋回同样的值都会导致编译错误:
      p=&b; //错误,p是只读的
      p=p;  //错误,p是只读的
      p++;  //错误,p是只读的
与任何const量一样,const指针必须在定义时初始化。
    注:指针本身是const的并没有说明是否能使用该指针修改它所指向对象的值。指针所指对象的值能否修改完全取决于该对象的类型,例如,p指向一个非const的int型对象a,则可通过p间接引用修改该对象的值:
     *p=100   //正确,a被修改。
【3】指向const对象的指针
     一个指针变量可以指向只读对象,称为指向const对象的指针,定义形式为:
     const 指向类型 * 指针变量名;
     即在指针变量定义之前加const限定符,其含义是指针指向的对象是只读的,换言之,不允许通过指针来改变所指向的const对象的值。
     例如:const int * p ;
     这里 p 是一个指向const的 int 类型对象的指针,const限定了p指针所指向的对象类型,并非p本身,也就是说,p本身并不是只读的,在定义时  不需要对p进行初始化,可以给p重新赋值,使其指向另一个const对象,但是不能通过p修改其所指向对象的值。
    例如:
    const int a = 10,b = 20 ;
    const int * p ;
    p = & a;  //正确,p不是只读的
    p = & b; //正确,p不是只读的,可以改变p的值
    *p = 42; //错误,*p是只读的   即p所指向的对象是只读的
   《1》把一个const对象的地址赋给一个非const对象的指针变量是错误的,例如
          const double pi = 3.14159;
          double *p =  π         //错误  p是非const的指针变量
          const double *p1 =&pi      //正确,p1是const指针变量
   《2》不能使用 void* 指针保存一个const 对象的地址,必须使用const void *指针保存const对象的地址,例如:
          const int x = 42;
          const void* p = &x;        //正确,p是const指针变量
          void* p1=&x ;              //错误,x是const的,
    《3》允许把非const对象的地址赋值给const对象的指针,例如:
          const double p =  3.14159;
          const double* p1 = &p;    //正确,p1是const指针变量
          double f = 3.14;
          p1 = &f;                 //正确,允许非const的对象的地址赋给const指针;
          f = 1.614;               //正确,可以修改f的值
          *p1 = 10.1;              //错误,不允许通过引用p1来改变f的值
      注:尽管f不是const对象,但是任何试图通过指针p1修改f的值的行为都会导致编译错误,p1一经定义,就不允许修改其所指向的值,如果该指针恰好指向一个非const对象时,同样必须遵守这个原则。
     《4》不能使用指向const对象的指针修改指向对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指向的对象。例如:
     double f, *p = &f; 
     const double* p1=&f ;
     f =  3.14 ;             //正确,f不是const  允许修改;
     *p1 = 3.14;             //错误,p1是const指针,不允许修改*p1;
     *p = 2.72;              //正确,ptr不是const指针,允许修改*p
    程序中,指向const的指针实际上指向一个非const对象,尽管它所指的对象并非const,但是仍然不能使用p1去修改该对象的值。本质上来讲,由于没有办法分辨 p1 所指向的对象是否为const,系统会把它所指的对象都视为const。
    如果指向const的指针所指的对象并非const,则可以直接给改对象赋值或者间接的利用非const指针修修改其值。毕竟这个对象不是const的:重要的是记住,不能保证指向const指针所指对象的值一定不被其他方式修改。
    在实际编程中,指向const的指针常用作函数的形参,将形参定义为指向const的指针,以此确保传递给函数的实参对象在函数中不被修改。    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值