//以int类型为例
- 指针常量——指针类型的常量(int const p*)
该指针是一个常量;也就是它指向某一个固定地址,不可以改变;
所以指针常量在定义时一定要初始化;此后我们不能再让它指向别的地址;
且不能用一个字符常量来初始化指针常量 ,可以用字符串常量或另一个指针常量来初始化;
const int n=10;
int 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
(常量);
- 常量指针——指向常量的指针(*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指向的是常量 不能被修改
- 指针常量和的常量指针与一般指针
任何指针都不能赋值给指针常量,因为该指针是一个常量不可修改
不能把常量指针赋值给非常量指针,反之可以
const int *p1;
int *p2;
p1=p2;//OK
p2=p1;//error 如果允许,那么就可以通过p2来修改p1,但实际上p1不可被修改,所以error
p2=(int *)p1;//OK 强制类型转换现在p1是int *类型
- 常量指针与函数参数
当函数参数为常量指针时 可以避免函数内部改变参数指针所指地方的内容(保护数据),
例如strcpy 函数中的第一个形参是char *
,如果是const char *
strcpy函数就会出错;
而strcpy 函数中的第二个形参是 const char *
,以避免函数内部改变参数指针所指地方的内容;
所以strcpy 函数中的第一个实参只能是char *
,
而第二个实参可以是const char *
也可以是char *
;
因为我们 “不能把常量指针赋值给非常量指针斜体样式,反之可以”。
不足之处请不吝指正
来源:https://blog.csdn.net/qq_43738363/article/details/102750288