常量:const int 和 int const
const 用来定义常量,所以const int 和 int const在修饰普通的变量类型(除指针)作用是相同的。
如:
int const a=5;
const int b=10;
a,b都是int型常量,不能被修改。
常量指针:const int* 和int const *
只要const位于*的左侧,无论它在类型名的左边或右边,都声明了一个指向对象的指针,叫做常量指针。
int a=10;
int *q=&a;
const int *p=&a;
定义一个变量a,q是一个普通的指向a的指针,p则是常量指针。这两者有什么区别呢?
普通指针q可以修改a,而对于指针p,不管他指向的是常量还是变量,在他眼中都是常量,都是不可修改的。也就是说常量指针是不能修改指向对象的值的指针。
常量指针的本质还是指针,可以指向任何变量或常量,也可以更改指向的对象,但是不管指向谁,他都不能去修改那个指向对象的值。
应用场景:
在函数参数传递时,往往需要传递指针(地址)或引用传递,通过地址修改数据是很容易的,为了防止函数修改数据,用const修饰指针,这就是常量指针。
#include <iostream>
using namespace std;
int a[100]={0,1,2,3,4,5,6,7,8,9,10};
void find(const int *a){
cout<<a[0]<<endl;
cout<<a[5]<<endl;
a[3]=10;
}
int main(){
find(a);
}
指针常量:int * const
声明方式:
int a;
int* const p = &a; //const放在指针声明操作符的右侧
只要const位于指针声明操作符右侧,就表示声明的对象是一个常量,且它的内容是一个指针,也就是一个地址。
上面的声明可以这么读:声明了一个常量p,它的值是变量a的地址(变量a的地址就是指向变量a的指针)。
指针常量是一个常量,在声明的时候一定要赋初始值。一旦赋值,这个常量再也不能被修改。
指针常量可以通过本身的指针特性去修改指向的对象。
指针常量是将一个常量(常量的值是地址)与一个对象锁定,一个指针常量绑定了一个对象后,就无法再更改,但是这个指针常量拥有和对象一样的权限,可以修改对象,也就是说他们现在合为一体了。
应用场景:
引用。引用的本质就是一个指针常量。
关于引用:https://blog.csdn.net/qq_21989927/article/details/107447970