注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

常量指针和指针常量  

2014-02-19 20:40:13|  分类: C & C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1.如何区分

这里以基本数据类型int型为例子。先谈谈const和int之间的关系:

int const a1;

const int a2;

熟悉C++的都知道这两个变量的类型没有什么区别,也就是说,const位于基本数据类型前后并不影响,都是常量,不能修改常量的值。

int* const p1;
const int* p2;
先看看这两个类型,怎么区分呢?很简单,区分方法是,看字面含义。
关键字const在前,指针类型在后,就是常量指针,而如果指针在前,关键字const在后,则为指针常量,因此,p1是指针常量,而p2为常量指针。

2.区别

先说说常量指针。简单来说就是,常量指针偏重常量,或者说量,你可以修改常量指针指向的地址,但是你不能通过该指针,修改常量指针指向地址中的值(因为值表现出常量的行为),不过该地址中的内容并不表现为常量,可通过其他方式修改。看下面的代码:

#include <iostream>
using namespace std;
//常量指针示例
int main()
{
    int a=10,b=20;
    const int* p1=&a;    //p1为常量指针
    int* p2=&a;
    //*p1=101;        //错误,不能给常量指针赋值,即常量指针不能修改所指向地址中的内容
    a=101;            //正确,可以通过变量名直接修改地址中的内容
    cout<<*p1<<endl;
    *p2=102;        //正确,p2为一般指针,可以修改其指向地址中的内容
    cout<<*p1<<endl;
    p1=&b;            //正确,常量指针可以指向不同的地址
    cout<<*p1<<endl;
    return 0;
}
因此,上面三个cout的结果分别是:
101
102
20
另外,大家也知道,常量不同于变量,其值不能修改,常量不同于字面值,字面值是没有地址的,例如’c’,”hello world!”等,他们并没有对应的地址,因此也不能做为左值。但是,说到底,常量应该算是一种特殊的变量,程序在运行时,还是会为常量分配地址的,常量在初始化的时候可以作为左值(虽然只有一次机会)。因此,在需要使用指针指向常量时(虽然这种行为很罕见),一般的指针并不合适,看看下面的语句:
const int a=10;
int* p1=&a;
编译器会报错:error C2440: “初始化”: 无法从“const int *”转换为“int *” ,这个时候就需要使用常量指针来指向该常量。
接下来再看看指针常量,指针常量则偏重于指针,就是指针常量所指向的地址不能变动,但是可以通过指针修改所执行地址中的值,也就是说,指针常量的所指向的地址是常量,一旦初始化就不能修改。还是通过代码说明。
#include <iostream>
using namespace std;
//指针常量示例
int main()
{
    int a=10,b=20;
    int* const p1=&a;
    //p1=&b;        //错误,不能修改指针常量的地址
    *p1=101;        //正确,可以通过指针常量修改所指向地址中的内容
    cout<<*p1<<endl;
    a=102;          //正确,可以通过变量名直接修改地址中的内容
    cout<<*p1<<endl;
    return 0;
}
因此,上面两个cout的结果分别是:
101
102
3.夹心饼干
这个是最后一种,类型为const int* const,如果非要给出翻译的话,可以叫做“常指针常量”。指针类型被两个常量夹在中间,然后造成的结果是――“动弹不得”。指针地址不能变,所指向地址中的内容也不能通过该指针修改。
#include <iostream>
using namespace std;
//指针常量示例
int main()
{
    int a=10,b=20;
    const int* const p1=&a;
    a=101;        //正确,直接修改变量,与指针无关
    //*p1=102;    //错误,不能通过指针修改所指向地址中的内容
    //p1=&b;    //错误,不能修改指针所指向的地址
    cout<<*p1<<endl;
    return 0;
}
  评论这张
 
阅读(400)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017