C++之指针常量和的常量指针浅析

十年热恋 提交于 2019-12-02 09:26:45

//以int类型为例

  1. 指针常量——指针类型的常量(int const p*)

该指针是一个常量;也就是它指向某一个固定地址,不可以改变;
所以指针常量在定义时一定要初始化;此后我们不能再让它指向别的地址;
且不能用一个字符常量来初始化指针常量 ,可以用字符串常量或另一个指针常量来初始化;

 const int n=10int m=100,t=0; 
 int *const pa=&m;
 //int *const pa=&n;// error 不能用一个字符常量来初始化指针常量 
 //char *const pa='A';//error 'A'是一个字符常量不是字符串常量
 //char *const pa="A";//OK "A"是一个字符串常量
 cout<<*pa<<endl;
 

但可以通过改变该变量来改变指针指向的地址的内容;

 m=20;
 cout<<*pa<<endl;
 cout<<m<<endl;

同样我们也可以通过改变该指针指向的地址的内容来改变该变量;

 *pa=n;
 cout<<*pa<<endl;

但无论该地址里的内容如何改变该指针常量都会指向该地址;

 //pa=&t;  error  指针pa是一个常量  不能被修改

从它的书写方式也可以看出const强调的是指针p,即p(指针)是const(常量);

  1. 常量指针——指向常量的指针(*const int p)

该指针指向的是一个常量(n);
从指针的书写方式也可以看出const 强调的是int(类型),即p(指针)指向的是一个const int(int型的常量);
而该指针所指的地址是可以被改变的,这时该指针也不会再指向常量(n);

const int n=10,m=20;
 const int*p=&n;
 cout<<*p<<endl;
 p=&m;
 cout<<*p<<endl;
 //n=30; //error 常量不能被修改
 //*p=20  error p指向的是常量 不能被修改
  1. 指针常量和的常量指针与一般指针
    任何指针都不能赋值给指针常量,因为该指针是一个常量不可修改
    不能把常量指针赋值给非常量指针,反之可以
const int *p1;
 int *p2;
 p1=p2;//OK
 p2=p1;//error  如果允许,那么就可以通过p2来修改p1,但实际上p1不可被修改,所以error
 p2=(int *)p1;//OK 强制类型转换现在p1是int *类型
  1. 常量指针与函数参数

当函数参数为常量指针时 可以避免函数内部改变参数指针所指地方的内容(保护数据),

例如strcpy 函数中的第一个形参是char *,如果是const char *strcpy函数就会出错;

strcpy 函数中的第二个形参是 const char *,以避免函数内部改变参数指针所指地方的内容;

所以strcpy 函数中的第一个实参只能是char *
而第二个实参可以是const char *也可以是char *

因为我们 “不能把常量指针赋值给非常量指针斜体样式,反之可以”。

不足之处请不吝指正

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!