C++中的指针常量和常量指针

    最近在看C++,看到指针这块的时候,突然觉得有点拗口,为了加深记忆,自己就来谈一下自己对于这两个概念的理解。

  Ø  指针常量

    释义:所指向的地址是常量,地址上面的数据是可以改变的。也就是指针常量,表述为“是指针的常量”,它首先应该是一个常量。指针常量,指针自身是一个常量,关键字 const 出现在 * 右边,表示指针自身不可变,但其指向的地址的内容是可以被修改的。

    指针常量就是是指针的常量,它是不可改变地址的指针,但是可以对它所指向的内容进行修改。

    例如:

int a=2;
int b=3;
int *const p=&a;
p=&b;         //错误,指针常量的值为常量,不能指向其他变量。
p=NULL;       //错误,指针常量的值为常量,不能被修改。
*p=4;         //正确,指针常量所指变量的值可以被修改。
*p=b;         //正确,指针常量所指变量的值可以被修改。


    定义:数据类型 *const 指针名=变量名

  Ø  常量指针

    常量指针,表述为“是常量的指针”,它首先应该是一个指针。常量指针,就是指向常量的指针,关键字 const 出现在 * 左边,表示指针所指向的地址的内容是不可修改的,但指针自身可变。

    常量指针就是指向常量的指针,指针所指向的地址的内容是不可修改的。 

    例如:

Const int a =2;
Int b=3;
Const int *p=&a;
P=&b;          //正确,常量指针可以指向其他变量
P=NULL;        //正确,指针常量的值可以被修改。

    定义:const 数据类型 *指针变量=变量名

         或者:数据类型 const * 指针变量=变量名

  Ø  举例进行解释(以C程序为例)

    第一个:

1   void main(){ 
2     char *str1={"Hello"};  
3     char *str2={"Hello World"};  
4     char * const ptr1 =str1  
5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化 
6     ptr1 =str2; //错误 因为这是一个常量指针,改变指向的地址了
7     printf("%s n",*ptr1); 
8     } 
9     // 编译错
      误    error C3892: 'ptr1' : you cannot assign to a variable that is const 

    第二个:

1  void main(){ 
2     char *str1={"Hello"}; 
3     char *str2={"Hello World"}; 
4     char * const ptr1 =str1  
5     //指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化  
6     *ptr1 ='A';// 正确 因为指向的地址的内容是可以变化的 
7     printf("%c n",*ptr1); 
8     }
9     //输出  A

    第三个:

1  void main(){ 
2     char *str1={"Hello"}; 
3     char *str2={"Hello World"};
4     const char *ptr1 = str1; 
5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化      
6     ptr1=str2;// 正确 因为指向的地址是可以变化的   
7     printf("%s n",ptr1); 
8     }
9     //输出 Hello World

    第四个:

1 void main(){ 
2     char *str1={"Hello"};
3     char *str2={"Hello World"};  
4     const char *ptr1 = str2; 
5     //常量指针--指向字符串常量,所指向的字符串内容不能变,但是指向的地址可以变化  
6     ptr1='A';// 错误 因为指向的地址是内容是不可以变化的  
7     printf("%c n",ptr1);
8     } 
9     //编译错
      误    error C2440: '=' : cannot convert from 'char' to 'const char *'

    这样是不是清晰多了。



评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值