指针常量、常量指针与指向常量的指针常量小结(C/C++)

一 指针常量:

int a;

int *const pcb = &a; //const放在指针声明操作符的右侧

只要const位于指针声明操作符右侧,就表明声明的对象是一个常量,且它的内容是一个指针,也就是一个地址。上面的声明可以这么读,声明了一个常量pcb,它的值是变量a的地址(变量a的地址,也就是指向变量a的指针)。

因为指针常量是一个常量,在声明的时候一定要给它赋初始值一旦赋值,以后这个常量再也不能指向别的地址。也就是说指针常量的指向地址一旦赋值就不能改变。

虽然指针常量的值不能变,可是它指向的对象是可变的,因为我们并没有限制它指向的对象是常量。

例如:

(1)如上所述:

int a;

int *const pcb = &a; //const放在指针声明操作符的右侧

a=1;

#include<iostream>
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<iostream>
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<iostream>
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<iostream>
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<iostream>
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)指向常量的指针常量。按照道理来说,他应该指向一个常量,此时不能更改指向地址、也不能更改指向地址的值。然而,如果指向的不是常量,那么可以通过修改被指对象的值而改变

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值