• (原+转)C++中的const修饰符


    const int a; int const a; 这两个写法是等同的,表示a是一个int常量。

    简记:const后面是什么就限定什么(因为C++标准规定,const关键字放在类型或变量名之前等价的)。比如const int *p就是限定(*p),(*p)就是p指向的那段内存不能变,p的值可以改变;如果是int* const p就是限定p指针的值(p指向的对象)。

    1 int a=5, b=8;   //声明变量。
    2 int *p;
    3 p=&a;  //声明指针。
    4 *p=3;

    则const int *p限定(*p),*p不能变,*p=3错误;但是p=&b;可以。

    int * const p限定p,p不能变,p=&b错误,但是*p=6;可以。

    const修饰指针一共只有三种写法 

    1. const int *p; 表示p是一个指针,指向const类型的对象(也可以指向非const对象),根本目的在于为了不可以通过p改变p所指对象的值。也可以写成int const* p;含义相同。例如: 

    1 int i=0,j=0; 
    2 const int *pi=&i;//这里就是const指针指向非const对象
    3 i=2;//ok i是非const 值可以改变 
    4 *pi=3;//错误pi是指向const对象的指针不可通过它改变指向对象的值
    5 pi=&j;//ok,p是指向const类型的指针,而本身不是const指针,可以改变指向

    2. int * const p; 表示p是一个指针常量,常被叫做const指针。这个const可以理解为修饰指针p,就是说p一旦指向某对象就不可以再改变指向了,因此初始化的时候必须固定指向一个int变量,之后就不能再指向别的地方了(其指向对象的值可以更改,但是指向的对象一旦固定,则不能更改)。例如 

    1 int i=0,j=0; 
    2 int * const p=&i;//ok定义时初始化 
    3 *p=1;//ok,p不是指向const对象的指针 
    4 p=&j;//错误,因为p已经指向i了不能更改指向了 

    3. const int * const a;表示a是一个指针常量,初始化的时候必须固定指向一个int常量或者int变量,之后就不能再指向别的地方了,它总是把它所指向的目标当作一个int常量,即:既不能通过p改变指向对象值也不可在p初始化后改变指向。也可以写成int const * const a;含义相同。例如:

    1 int  n;
    2 const int * const p3 = &n;

    则p3本身的值和所指向的值都不能改变了.也就是说,你既不能写 p3 = &n1,也不能写 *p3 = 100了.


    实际编程的情况: int * const p的定义很少去用,用的比较多的是 const char * const msg = "Hello";这样的定义, 用于在C++中,代替C中使用宏来定义常量字串的作用.

    const char **是一个指向指针的指针,那个指针又指向一个字符串常量。(暂不太理解

    char **也是一个指向指针的指针,那个指针又指向一个字符串变量。

    对于:int **a;

    首先变量a和指针运算符*结合,表明这是一个指针,然后再和第二个*结合表明这个指针指向的是一个指针的地址。因此应将一个指针的地址赋给变量a才是正确的,比如

    int b=1; int *p=&b; int **a=&p;

    再如int *&a;

    分析:首先变量a与&运算符结合,表明变量a是一个引用,然后再与*指针运算符结合,表明这个引用引用的是一个指针,因此应将一个指针赋给变量a,比如

    int b=1; int *p=&b; int *&a=p;

    ps,考虑传递形参的时候:

    int *p=NULL;

    想在change函数中给p分配内存的话,则需要使用指针的指针。如果只使用

    1 void change1(int *point)
    2 {
    3     point =new int [5];
    4 }

    当函数change1执行完毕后,外面的p依旧是NULL。

    使用下面的函数:

    1 void change2(int **point)
    2 {
    3     * point =new int [5];
    4 }

    则调用完change2后,p分配了内存。change2的形参为指向指针的指针。

    后面的说的不太清楚吧,自己也没有理解透彻吧,只知道在函数内部分配内存的话,需要指针的指针。

    参考网址:

    http://blog.163.com/pei_hua100/blog/static/805697592009550281616/

    http://bbs.csdn.net/topics/310124559

    http://zhidao.baidu.com/link?url=PdmtY2yxY8dFAqMelG2GmpSGbwoU8BGnxygoQXKgbjoe0AlsJkNgiVjeRYu9bBeb6ajDKW3458ssGUAR9Ivly_

    http://zhidao.baidu.com/link?url=VKN4RqU7mBeby4EYCqcJUAeD4ki8T1goqhcNLFg7XqD73xKj0XQsbYf8Qh-qwJ6ZFff4YsSyZgqTDxnQleUfxK 

  • 相关阅读:
    通过IP获取所在城市
    一次完整的HTTP请求过程
    Array.prototype.slice.call(arguments)
    移动web资源整理
    Null 和 Undefined
    JS正则表达式
    JavaScript和JSP的区别?
    JS判断图片上传时文件大小和图片尺寸
    JavaScript中的callee与caller的区别
    php结合redis实现高并发下的抢购、秒杀功能
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4365643.html
Copyright © 2020-2023  润新知