const int *p,int *const p区别

来源:互联网 发布:金川集团网络学校 编辑:程序博客网 时间:2024/05/22 01:52

1)先从const int i说起。
使用const修饰的i我们称之为符号常量。即,i不能在其他地方被重新赋值了。注意:const int i与int const i是等价的,相同的,即const与int的位置无所谓。
2)const int *p(指向常量的指针,常量不可改变;指针指向的值不可变,但是指针可以指向其他量)值不变,地址可变
看例子:
int i1=30;
int i2=40;
const int *p=&i1;
p=&i2;  //此处,p可以在任何时候重新赋值一个新的内存地址。
i2=80;  //这里能用*p=80来代替吗?答案是不能
printf("%d",*p);  //输出80
分析:p的值是可以被修改的,即它可以重新指向另一个地址。但是不能通过*p来修改i2的值。
首先,const修饰的是整个*p(注意,是*p而不是p),所以*p是常量,是不能被赋值的。虽然p所指的i2是变量而不是常量;
其次,p前并没有用const修饰,所以p是指针变量。能被赋值重新指向另一个内存地址。
3)int * const p(常指针,指针指向的地址不变,除非改变该地址的值)
int i1=30;
int i2=40;
int * const p=&i1;
//p=&i2;  错误的。p不能再指向另一个新地址了。
i1=80;  //这里能用*p=80来代替,即可以通过*p修改i1的值。
printf("%d",*p);
分析:
此时p的值不能被赋值修改了,只能永远指向初始化时候的内存地址。相反,可用*p修改i1的值了。
所以:综上所述,
指针p因为有了const的修饰,所以为指针常量,即,指针p不能修改了。
整个*p前面没有const修饰,则*p为变量而不是常量,所以,可改变*p的值。
如果const修饰在*p前则不能改的是*p,而不是指p;
如果const是直接写在p前,则p不能改。
4)补充
const int i1=40;
int *p;
p=&i1;  //提示错误,无法从const int转为int。
----------------------------------------
const int i1=40;
const int *p;
p=&i1;  //两个类型相同,可以这样赋值。

 

转http://blog.sina.com.cn/s/blog_6af956630100vpv2.html



上次中兴一道笔试题。当时是猜的,回来总结一下。
char * const p 与 char const * p 。

[cpp] view plaincopy
#include <iostream>
using namespace std;

int main(){
    int *p=new int(5);
    *p=6;
    cout<<"p:"<<*p<<endl;

    int const *p1=new int(5);
    //*p1=6;内容不可变,出错
    //cout<<"p1-1:"<<*p1<<endl;
    p1++;
    cout<<"p1:"<<*p1<<endl;//下一个地址的值,是不可知的


const int *p4=new int(5);  
    p4++;  
//    *p4=8;  内容不可变
    cout<<"p4:"<<*p4<<endl;  //下一个地址的值,是不可知的
    //指针常量  


    int * const p2=new int(5);  
    *p2=6;
    cout<<"p2-1:"<<*p2<<endl;
   // p2++;  地址不可变,出错
   // cout<<"p2-2:"<<*p2<<endl;  
     

    //指针常量,所指向的量也不能变  
    const int * const p3=new int(5);  
    //*p3=6;  
    //p3++;  地址 内容均不可变
    cout<<"p3:"<<*p3<<endl;  

    system("pause");

    return 0;

}
1)int * const p; p为指向字符变量的指针,地址不变,地址内容可变,从左往右读 "指针常量"。
2)const int *p; p为指向字符变量的指针,地址可变,地址内容不变,从左往右读  "常量的指针"。
3)const int* const p (指针不能变,指的量也不能变)
4)*在const前表示指针为常量,只能初始化,初始化后就不能再指向别的地址,但是可以改变指针指向的变量的值。
  const在*前面,表示指针指向的值为常量,但是指针可以指向不同的变量。
5)char const *p; 与 const char *p; 等价,只是个人的书写习惯,主要区别是const 和 * 位置的区别。
上面程序运行结果如下:
[cpp] view plaincopy
  1. p:6  
  2. p1:-33686019  
  3. p4:-33686019  
  4. p2:6  
  5. p3:5  
  6. Press any key to continue  
如果把程序中任意一行注释去掉就会报error C2166: l-value specifies const object的错。
http://blog.csdn.net/clam_clam/article/details/6824275
原创粉丝点击