zoukankan      html  css  js  c++  java
  • C++指针与const

      在C++中,const修饰符一般用于修饰常量。常量在定义的时候必须初始化,而且值一旦定义之后就不能修改,这样就能保证常量的值在程序运行过程中不会发生变换。

    1.指向const对象的指针

      指向const对象的指针本身的指向可以发生变换,但是不可以通过该指针修改所指向变量的值。指向const对象的指针在定义的时候无需初始化,而且这种类型的指针也可以指向普通变量,只不过不能通过该指针修改对应变量的值,即便对应变量不是常量。指向常量的指针在类型标识符前必须有const修饰符修饰,否则编译不通过。

      指向const对象的指针的定义与用法如下所示:

    const int a=1;
    int b=1; 
    
    //指向常量的指针在定义时无需初始化
    const int *cptr;
    //将const放在类型前面或者后面,二者的意义完全相同
    int const *cptr;
    
    int *ptr;
    cptr= &a;
    
    *cptr =2 ;
    //非法,不能通过该指针修改指向变量的值
    
    cptr =&b;
    *cptr = 3;
    //非法,不能通过该指针修改指向变量的值,即便指向的变量不是常量 ptr =&b; *ptr=3; //合法! ptr =&a; //非法,指向常量的指针强制要求在类型标识符前使用const修饰符,否则编译不通过

    2.const 指针

      const指针本身是常量,其值必须在定义时初始化,且const指针指向的地址在初始化之后无法修改。const指针不能指向常量(除非是指向const对象的const指针),但是可以通过const指针修改其指向的变量的值。

      const指针的定义及用法如下所示:

    int a=1;
    const int b=2;
    
    int *const cptr;
    //非法,const指针在定义时就要初始化
    
    int *count cptr=&b;
    //非法,const指针不能指向const对象,除非该指针是指向const对象的const指针
    
    int * const cptr =&a;
    *a=2;
    //可以通过const指针修改其指向的变量的值

    3.指向const对象的const指针

      指向const对象的const指针同时具有1和2中指针的属性。首先不能通过该指针改变其指向对象的值,即便其指向的对象是常量(还是可以指向一般变量的,只是不能通过该指针修改指向的变量的值);另外该指针的值一旦初始化,之后不能修改,而且该指针的值必须在定义时初始化。

      指向const对象的const指针的定义及使用如下所示:

    const int a =1;
    int b=2;
    
    const int * const cptr;
    //非法,必须在定义时初始化
    
    const int * cosnt cptr =&a;
    int const * const cptr =&a;
    //上述两种顺序的定义意义完全一致
    
    const int * const cptr_1 =&b;
    //可以指向一般变量
    
    *cptr_1 =1;
    //非法,不能通过该指针改变其指向的对象的值,即便指向的对象不是常量
    
    *cptr=2;
    //非法,不能通过该指针改变其指向的对象的值

     

    附录:指针和typedef

      设使用typedef定义了下述数据类型:

    typedef string * pstring;
    const pstring cstr;
    pstring const cstr1;

      那么cstr和cstr1真实的数据类型是什么?此时需要认识到const修饰的是pstring的类型,这是一个指针,所以const是直接修饰指针的!因而cstr和cstr1的数据类型都是——

    string * const ptr;

    参考:C++ Primer 3rd

     

  • 相关阅读:
    PHP 操作MySQL时mysql_connect( )和Mysqli( )的两种报错机制
    OS + macOS Mojave 10.14.4 / sushi / ssh-keygen / ssh-copy-id
    script ajax / XHR / XMLHttpRequest
    java socket / No buffer space available
    OS + Ubuntu ARM Android
    mysql中批量替换数据库中的内容的sql
    linux下ubuntu系统安装及开发环境配置
    PHP 截取字符串专题
    在Ubuntu中用root帐号登录
    理解javascript的caller,callee,call,apply概念
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5469583.html
Copyright © 2011-2022 走看看