1.const 修饰指针——常量指针
int a=10;
int b=30;
const int *p=&a; //此为常量指针,指针指向可以改,指向的值不可改
*p=b; //此句非法,会报错
p=&b; //此句正确
eg.
#include <iostream>
using namespace std;
int main(){
int a=10,b=30;
const int *p=&a;
cout<<"*p(p指向的值)="<<*p<<endl;
cout<<"p="<<p<<endl;
cout<<"b的地址&b="<<&b<<endl;
p=&b;
cout<<"此时指针指向:"<<p<<endl;
cout<<"*p(p指向的值)="<<*p<<endl;
cout<<"a的值为:"<<a<<endl;
cout<<"const int *p"<<endl;
return 0;
}
运行结果如图:
示意图:
由图知,当定义const int *p(常量指针)时,指针p的内容可以由a的地址变为b的地址,即由0018FF44变为0018FF40,但a的值不会变!即经过上述代码操作后,指针p由原先指向a变为指向b。
2. const 修饰常量——指针常量
int a=10;
int b=30;
int *const p=&a; //此为指针常量,指针指向值可以改,指向不可改
*p=b; //此句正确
p=&b; //此句非法,会报错
eg.
#include <iostream>
using namespace std;
int main(){
int a=10,b=30;
int *const p=&a;
cout<<"*p(p指向的值)="<<*p<<endl;
cout<<"p="<<p<<endl;
cout<<"b的地址&b="<<&b<<endl;
*p=b;
cout<<"此时指针指向:"<<p<<endl;
cout<<"*p(p指向的值)="<<*p<<endl;
cout<<"a的值为:"<<a<<endl;
cout<<" int *const p"<<endl;
return 0;
}
运行结果如图:
示意图:
当定义int *const p(指针常量)时,指针的指向固定,即指向a的内存区,且不可再指向别的内存区域(如b),但指向的内容可以修改,如代码结果a的值由10被修改为30
3.const既修饰指针又修饰常量
int a=10;
int b=30;
const int *const p=&a; //指针指向值与指向均不可改
*p=b; //此句非法,会报错
p=&b; //此句非法,会报错
4. Summary
记忆方法:const在谁左边,谁不能变:
const int *p; //const在*p左边,即指针p指向的内容不可变
int *const p; //const在p左边,即指针p的内容不能变