一、const在指针中的应用(以int作为数据类型代表)
1、常量指针(const int* p):指针的指向可以更改,但指针指向的值不可以直接更改。
说白了最大的特点就是对 *p是不能进行赋值操作的,但要注意随着指针指向的改变,或者指向的变量本身的值的改变,*p也是会改变的。
int a=10;
int b=20;
const int*p;//不必初始化
p=&a;
cout<<"*p="<<*p<<endl;//输出结果*p=10
//*p=20为非法语句
p=&b;//或者a=b
cout<<"*p="<<*p<<endl;//输出结果*p=20
2、指针常量(int* const p):指针的指向不可以更改,但指针的内容可以更改。
说白了就是初始化后不能再让指针指向别的地址,但依旧可以通过改变指向的变量的值,或者直接对 *p赋值来改变该地址的内容。
指针常量在定义时就应该被初始化,且初始化的地址必须是一个变量的地址,如果用常量的地址则会被报错。可能是因为能够通过 *p来重新赋值,这可能会与常量属性产生矛盾。
int a=10;
const int b=20;
int* const p=&a;
*p=b;//a=b;将*p的值改为20
cout<<"a="<<a<<endl;//输出结果a=20
3、指向常量的指针常量(const int* const p):不能更改指针的方向,不能通过*p更改指针指向的值。
该类型指针在定义时也必须初始化,用来初始化的地址可以是常量地址,也可以是变量地址。当初始化使用的是常量地址时,指针指向的地址和该地址内的值都不可以再更改(这与上一个指针不能使用常量地址初始化似乎相关);当初始化使用的是一个变量地址时,就只能通过对变量赋值来改变地址中的值。
const int a=10;
const int* const p1=&a;//这样大家就都动不了了
int b=10;
const int* const p2=&b;
b=20;//通过对变量赋值来改变地址中存放的值
cout<<"*p="<<*p<<endl;//*p=20
4、const 表示“只读”的含义的应用
在使用传引用(即地址传递,pass by reference)时,如果在形参前加上const就不会对实参产生影响,同时又避免了重新分配内存空间,但相应的函数中就不能出现对形参赋值的语句。
void plusone(int a){
a+=1;
cout<<&a<<endl;
}
int main(){
int a=0;
plusone(a);
cout<<"a="<<a<<endl;//输出结果a=0
cout<<&a<<endl;//输出的两个地址不相同
}
/*--------------------------------------*/
void plusone(int&a){
a+=1;
cout<<&a<<endl;
}