美文网首页程序员
const的高级用法

const的高级用法

作者: 平凡的鱼仔 | 来源:发表于2018-09-16 09:50 被阅读13次

    本文主要展示constant数组、constant指针和指向constants的指针的用法。

    const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};   
    days[9] = 44;    /*编译出错 */ 
    
    //指向常量的指针不能用于改变指向的数据的值,具体可以参考下面的代码 :
    double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
    const double * pd = rates;    // pd points to beginning of the array   
    
    /*
    上面代码的第二行将pd指针指向的对象为const类型,这意味着你不能**使用pd指针**来改变pd所指向的对象的值:
    */
    *pd = 29.89;      // 不允许
    pd[2] = 222.22;   // 不允许
    rates[0] = 99.99; // 允许,因为rates数组不是const类型
    
    
    //在上面的例子中,不管使用指针标记法(*pointer)还是数组标记(pointer[i]),
    //你都不能使用指针pd改变所指向内容的值。但是,rates没有被声明//为const,
    //所以你仍然可以使用rates来改变数值。当然,你可以让pd指向其它位置:
    
    pd++;       /*使pd指向rates[1],允许*/   
    
    /*指向常量的指针用作函数的形参时,表明函数不打算用指针改变数据。例如,
    函数*/void show_array(const double ar[], int n);/*可以声明为这样的形式*/:void show_array(const double *ar, int n);   
    /*
    可以将非常量数据或者常量数据的地址赋给指向常量的指针:
    */
    double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
    const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
    const double * pc = rates;    // 合法
    pc = locked;                  // 合法
    pc = &rates[3];               //合法  
    
    /*然而只有非常量的数据的地址可以赋给普通的指针:*/
    double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
    const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
    double * pnc = rates;          // 合法
    pnc = locked;                  // 不合法
    pnc = &rates[3];               // 合法  
    
    /*函数show_array()可以接收普通的数组或者常数组作为实参,因为二者的地址都可以赋给指向常量的指针:*/
    show_array(rates, 5);    // 合法
    show_array(locked, 4);   // 合法   
    
    /*
    因此,使用在函数声明时使用const不仅可以保护数据,还允许函数接收常数组。像下面的函数
    mult_array()不能接收常数组的地址:
    */
    mult_array(rates, 5, 1.2);    // 合法
    mult_array(locked, 4, 1.2);   // 不合法  
    

    show_array()原型为void show_array(const double ar[], int n);
    或者void show_array(const double*, int );
    mult_array()函数原型为void mult_array(double ar[], int n, double mult);
    函数原型可以参考数组形参文章

    下面是关于const的更多用法,比如,声明和初始化指针时使指针只能指向一个地方,而声明方式有点戏剧性,只是和const的位置和上面例子中的不一样:
    double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
    double * const pc = rates; // pc指向数组的首地址
    pc = &rates[2]; // 不合法,pc不能指向其它地方
    *pc = 92.99; // 合法,pc的值不能变但是指向的对象的值能变
    这样的指针依然可以改变指向的对象的值,但是它只能指向最初被赋予的位置。
    如果你希望指针值和指针指向的值不变,你可以使用两个const

    double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
    const double * const pc = rates;`
    pc = &rates[2];               // 不允许
    *pc = 92.99;                  // 不允许  
    

    相关文章

      网友评论

        本文标题:const的高级用法

        本文链接:https://www.haomeiwen.com/subject/euqtnftx.html