我们知道,const可以修饰一般的变量,这样的变量我们称之为常变量,常变量的值是不能修改的。
const也可以修饰指针变量,可以指定指针变量是一个常量,或者指定指针变量指向的对象是一个常量。有以下几种情况。
一、指向常量的指针变量
const int *p指针指向int a;
格式为:
const 类型名 * 指针变量名;
#include<iostream>
using namespace std;
int main()
{
int a = 10;
const int *p = &a;
//*p = a;//报错,表达式必须是可以修改的左值。
a = 20;//合法
cout << a << endl;
return 0;
}
分析:用指向常量的指针变量只是限制了通过指针变量改变它指向的对象的值,但是可以通过它本身来改变它的值。
指向常量的指针变量一般用处是作为函数参数
二、常指针(常地址)
int * const p指针指向int a;
形式为:
类型名 * const 指针变量名;
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int b = 10;
int * const p = &a;
*p = a;//合法
//p = &b;报错,表达式必须是可以修改的左值。
cout << a << endl;
return 0;
}
说明:
1.这种指针变量称为常指针变量,简称常指针,即指针值(地址)不能改变。
2.必须在定义时初始化,指定其指向(类似于在建立常变量时也必须初始化)
3.指针变量的指向不能改变你,但是指针变量的指向变量的值可以改变
4.注意const和*的位置
常指针一般用处在于c++的引用。c++引用的本质就是常指针
三、指向常量的常指针
const int * const p指针指向int a;
形式为:
const 类型名 * const 指针变量名;
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int b = 10;
const int * const p = &a;
//*p = a;//报错,表达式必须是可以修改的左值。
//p = &b;//报错,表达式必须是可以修改的左值。
a = 100;//合法
cout << a << endl;
return 0;
}
四、其他情况
int *p指针指向const int a(报错)
#include <iostream>
using namespace std;
int main()
{
const int a = 10;
//int *p = &a;//报错,const int不能用于初始化int *
return 0;
}
const int *p指针指向const int a
#include <iostream>
using namespace std;
int main()
{
const int a = 10;
const int b = 20;
const int *p=&a;
//*p = 100;//报错,表达式必须是可修改的左值
//a = 100;//报错,表达式必须是可修改的左值
p = &b;//合法
cout << *p << endl;
return 0;
}