常量指针、指针常量的区别

**要有具备扎实指针知识……
了解引用指针的一些注意事项:

  • 引用并非对象
  • 引用必须初始化
  • 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起
  • 类型要严格匹配

一、常量指针

定义
又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。

特点

  • 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
  • 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
  • 指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;

表示形式
int const* p1; const int* p1;

二、指针常量

定义
本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。

特点

  • 它是个常量!
  • 指针所保存的地址可以改变,然而指针所指向的值却不可以改变
  • 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;

表示形式:

int* const p1;

三、两者区别

//-------常量指针------- //
const int *p1 = &a; a = 200; //OK,仍然可以通过原来的声明修改值,
// *p1 = 13; //Error,*p1是const int的,不可修改,即常量指针不可修改其指向地址
p1 = &b; //OK,指针还可以指向别处,因为指针只是个变量,可以随意指向;

//-------指针常量-------//
int* const p2 = &a; a = 200; //OK,仍然可以通过原来的声明修改值,初始化的就给它分配地址,可以的(相当于分配初值);
*p2 = 900; //OK,指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
//p2 = &b; //Error,因为p2是const 指针,因此不能改变p2指向的内容

补集一个:

//-------指向常量的常量指针-------//
const int* const p3 = &a; //*p3 = 1;
//Error //p3 = &b; //Error
a = 10; //OK,仍然可以通过原来的声明修改值

四、代码实现、实例讲解
-------常量指针-------

#include <stdio.h>
int main()
{
        int a;
        int b;
        const int *p1 = &a;
        a = 300;     //OK,仍然可以通过原来的声明修改值,
        b = 100;
        //*p1 = 60;  //Error,*p1是const int的,不可修改,即常量指针不可修改其指>向地址
        printf("p1=%p\n",p1);
        printf("p1=%d\n",*p1);
        p1 = &b;     //OK,指针还可以指向别处,因为指针只是个变量,可以随意指向;
        printf("p1=%p\n",p1);
        printf("p1=%d\n",*p1);
        return 0;
}

运行结果:

p1=0x7fffb29b22d8
p1=300
p1=0x7fffb29b22dc
p1=100

-------指针常量-------

#include <stdio.h>
int main()
{
	int a;
	int b; 
	int*  const p2 = &a;
	a = 900;     //OK,仍然可以通过原来的声明修改值,
	printf("p2的地址=%p\n",p2);
	printf("p2的值=%d\n",*p2);
	*p2 = 100;   //OK,指针是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
	printf("p2的地址=%p\n",p2);
	printf("p2的值=%d\n",*p2);
//	p2 = &b;     //Error,因为p2是const 指针,因此不能改变p2指向的内容	
	return 0;
} 

运行结果:

p2的地址=0060FF08
p2的值=900
p2的地址=0060FF08
p2的值=100

大结:两者的重要区别,可不可以通过修改地址来改别常量

  • 14
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值