zoukankan      html  css  js  c++  java
  • (原+转)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 

  • 相关阅读:
    一些业内有名的网站收集
    WCF重载
    FCKEditor fckconfig.js配置,添加字体和大小 附:中文字体乱码问题解决
    查询第几条到第几条的数据的SQL语句
    SPOJ 9939 Eliminate the Conflict
    UVA 10534 Wavio Sequence
    HDU 3474 Necklace
    POJ 2823 Sliding Window
    UVA 437 The Tower of Babylon
    UVA 825 Walking on the Safe Side
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/4365643.html
Copyright © 2011-2022 走看看