int a;
int *const pcb = &a; //const放在指针声明操作符的右侧
只要const位于指针声明操作符右侧,就表明声明的对象是一个常量,且它的内容是一个指针,也就是一个地址。上面的声明可以这么读,声明了一个常量pcb,它的值是变量a的地址(变量a的地址,也就是指向变量a的指针)。
因为指针常量是一个常量,在声明的时候一定要给它赋初始值。一旦赋值,以后这个常量再也不能指向别的地址。也就是说指针常量的指向地址一旦赋值就不能改变。
虽然指针常量的值不能变,可是它指向的对象是可变的,因为我们并没有限制它指向的对象是常量。
例如:
(1)如上所述:
int a;
int *const pcb = &a; //const放在指针声明操作符的右侧
a=1;
#include
using namespace std;
int main()
{
int a;
int *const pcb = &a; //const放在指针声明操作符的右侧
a = 1;
cout << *pcb << endl;
*pcb = 3;
cout << *pcb << " \t" << a << endl;
system("pause");
return 0;
}
输出:
1
3 3
(2)又如
#include
using namespace std;
int main()
{
char a[] = "abcde1234";
char *const c = a;
cout << c << endl;
c[0] = 'x';
cout << c << "\t" << a << endl;
system("pause");
return 0;
}
输出:
abcde1234
xbcde1234 xbcde1234
常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值。
形如:const int *p;
例如:
int a = 5;
const int b = 8;
const int *c = &a; // 这是合法的,非法的是对c的使用
*c = 6; // 非法,但可以这样修改c指向的对象的值:a = 6;
const int *d = &b; // b是常量,d可以指向b,d被赋值为b的地址是合法的
#include
using namespace std;
int main()
{
int a = 5;
const int b = 8;
const int *c = &a; // 这是合法的,非法的是对c的使用
cout << a << "\t" << *c << endl;
a = 6;
cout << a << "\t" << *c << endl;
c = &b;
cout << a << "\t" << *c << endl;
// *c = 6; // 非法,但可以这样修改c指向的对象的值:a = 6;
const int *d = &b; // b是常量,d可以指向b,d被赋值为b的地址是合法的
system("pause");
return 0;
}
输出:
5 5
6 6
6 8
在C/C++中,这么声明:
const int a = 25;
const int * const b = &a;
看,指针声明操作符左边有一个const,说明声明的是一个指向常量的指针。再看,指针声明操作符右边有一个const,说明声明的是一个指针常量。前后都锁死了,那么指向的对象不能变,指针常量本身也不能变。
#include
using namespace std;
int main()
{
char a[] = "abcde1234";
const char b[] = "bcde"; // b是指向常量字符串的指针变量
char *const c = a; // c是指向字符指针变量的常量
const char * pc = a; // pc是指向字符常量指针
const char *const cpc = a; // cpc是指向字符常量的指针常量
const char *const d = b; // d是指向字符常量的指针常量
c[0] = 'x';
cout << a << "\t" << c << "\t" << pc << "\t" << cpc << endl;
a[1] = 'x';
cout << a << "\t" << c << "\t" << pc << "\t" << cpc << endl;
// pc[2] = 'x';//非法操作
// cpc[2] = 'x';//非法操作
system("pause");
return 0;
}
输出:
xbcde1234 xbcde1234 xbcde1234 xbcde1234
xxcde1234 xxcde1234 xxcde1234 xxcde1234
#include
using namespace std;
int main()
{
const int a = 25;
const int * const b = &a;
cout << a << "\t" << *b << endl;
// a = 1;//非法
// *b = 1;//非法
system("pause");
return 0;
}
输出:
25 25
(1)指针常量,一旦初始化就不能更改指向对象。也就是说指针指向的地方是常量,而被指向地址所放的值可以改变。
(2)常量指针,指针指向值为常量,不可以通过常量指针去改变。只能通过被指向对象本身去改变。
(3)指向常量的指针常量。按照道理来说,他应该指向一个常量,此时不能更改指向地址、也不能更改指向地址的值。然而,如果指向的不是常量,那么可以通过修改被指对象的值而改变。