您的位置:首页 > 编程语言 > C语言/C++

c++ 常量指针 const*const

2015-07-10 17:23 393 查看
1.什么是常量指针

我们可以使用const 来修饰指针,在用const 修饰指针时,我们可以指出,指针自身,指针所指的内容,为常量 const。当const修饰指针时,如果关键字const出现在 星号* 左边 表示的是指针所指的内容为常量,如果关键字const 出现在星号* 右边 表示的是指针本身为常量。如果const出现在星号*两边 表示 指针本身 和指针所指的内容都为常量,不能被修改。为了更清楚地说明const是如何修饰指针的,请看以下代码

#include<iostream>
using namespace std;

//测试 const关键字修饰指针
int main(void){

    int a = 3;//定义了一个整形变量a 并且用3来初始化变量a 这里a的     
              //值为3
    int b = 4;//定义了一个整形变量b ,用4来初始化变量 b 这里b 
              //的值为4
    int *pa = &a;//定义了一个指向整形的指针变量pa ,pa指向a 的
                 //地址 此时pa的值为 a的地址&a ,*pa 的值为3
                 //此时因为星号*前面和后面都没有const修饰,所以   
                 //不管是指针变量pa还是指针pa所指物都可以发生改    
                 //变

//指针本身发生改变

    pa = &b;//此时指针变量pa的指向发生了改变,把变量b的地址赋值给
           //了pa 是合法的,此时pa 的值为b的地址&b,*pa 的值为   
           //变量b的值4

//指针所指的内容发生改变

    *pa = a;//此时指针变量pa的指向没有发生改变,还是指向上一指令b
            //的地址,但是指针所指的内容已经由变量b 变为变量a 此
            //时*pa的值为变量a的值3

//const 修饰指针本身 指针本身不能发生改变,指针所指的内容可以改变 

    int* const pc = &a;//定义了一个指向整形变量的常指针pc,并且
                       //把变量a的地址&a 赋给 pc 此时 pc 指   
                       //向变量a的地址&a,*pc 的值为变量a 等
                       //于3
    //pc = &b;      //编译器报错,表达式必须是可修改的左值,因为               
                    //pc 为常指针,指针本身不能发生改变
    *pc = b;      //可以通过,指针pc 所指的内容是可变的,此时把 
                  //变量b 赋给 pc所指的内容,*pc 此时由a的值3
                  //变为b的值4

//const 修饰指针所指的内容,把const放在* 左边,此时指针本身pd可以发生改变,指针所指物*pd不能发生改变

     const int * pd = &a;//定义另一个指针变量pd ,pd所指的内容*pd为常量,并且把变量a的地址&a 赋给pd ,此时指针变量pd 的值为变量a的地址&a
    //*pd = b;//编译器报错  “不能给常量赋值”此时 指针变量pd所指的内容为常量,不能发生改变

    //const 既修饰指针本身 又修饰指针所指的内容 

     const int* const pe = &a;//此时定义了一个指向常量型的指针常量 pe ,并且把变量a的地址赋&a 赋值给pe,此时无论指针pe 还是指针pe所指的内容都不能发生改变

    //pe = &b; //编译器报错 “表达式必须为可修改的左值” 
    // *pe = b;// 编译器报错 “表达式必须为可修改的左值”

    cout << *pa <<endl;

    return 0;
}


2.怎么使用常量指针?

因为常量定义式通常被放在头文件内(以便被不同的源码引入)

,因此有必要将指针 (而不是指针所指的内容)声明为const

如 int const b = &a;如果在头文件内定义一个常量(不变的量)const必须写两次, 如: const int const b = &a ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: