C/int *p, int const *p; int *const p,int const *const p 之间的关系

首先说明:int *p 等价于 int* p;

int *p:

定义了一个指针,指向一个整型类型的变量;其中,p(地址)可变,*p(值)也可以变;

int const* p:

定义了一个指针,指向的是整型常量,即:可以修改指针的值,但不能修改所指向的值。所以p(地址)可变,*p(值)不可变;

int const *p2;
const int *p3;  //int cont *p2 和 const int *p3 是一样的,代表 p(地址)可变,但不能通过*p修改值,因为*p 是常量,不能被赋值
int i1=30;
int i2=40;

p2=&i1; //指针p2,新的内存地址,是i1的地址;
printf("pointer address is %d,value is %d\n",p2,*p2);
p2=&i2;
printf("pointer address is %d,value is %d\n",p2,*p2);

/****    不能用*p2 来改变指针指向的值,因为指针指向的是整型常量,是不能变的,不能被赋值   ***********/
//*p2=188;
//printf("pointer address is %d,value is %d\n",p2,*p2);
//*p2=i1;
//printf("pointer address is %d,value is %d\n",p2,*p2);

首先说明下,int const *p 和const int *p 是等效的;

因为指针值(地址)可变,所以可以通过p2=&i1,p2=&i2 的方式,来改变指针的值;

但是,不能通过*p2=188, 或者*p2=i2 的方式来改变指针指向的值。

int *const p:

定义了一个 常量指针,指向一个整型变量。此时,指针是常量,不能修改,但可以修改指针指向的值。即p(地址)不能修改,但*p(值)可以修改。


/***不能这样给p4赋初始值,因为前面定义的时候已经自动为他分配地址了**/

//int *const p4;  //一个常量指针(地址不可变),指向一个整型变量(值可变)
//p4=&i1;   //给指针初始化,值为i1的地址, 因为是常量指针,不能再二次赋值了,永远是这个地址
int *const p4=&i1;
printf("pointer address is %d,value is %d\n",p4,*p4);
i1=50;
printf("pointer address is %d,value is %d\n",p4,*p4);
/*****/
*p4=i2;
printf("pointer address is %d,value is %d\n",p4,*p4);

对于这种类型的指针,

如上图代码,

int *const p4;

p4=&i1, 这种写法对指针进行初始化是错误的,因为定义指针的时候就分配地址了。

所以只能 int *const p4=&i1;

因为指针指向的值是可以变得,所以可以通过*p4=i2 的方式,来改变指针指向的值;

int const *const p:

定义了一个常量指针,指向一个整型常量。这里指针本身(地址),及其指向的值,都是常量,不能修改。

int i3=100;
int const *const p5=&i3; //一个常量指针(地址不可变),指向一个const int 常量,值不可变;
printf("pointer address is %d,value is %d\n",p5,*p5);
i3=200;
printf("pointer address is %d,value is %d\n",p5,*p5);
/*****P5 read-only,不能再赋值****/
//p5=&i1;
//printf("pointer address is %d,value is %d\n",p5,*p5);
/********    *p5 read-only,不能再赋值   *********/
//*p5=120;
//printf("pointer address is %d,value is %d\n",p5,*p5);
int const i4=110;
int const *const p6=&i4;
printf("pointer address is %d,value is %d\n",p6,*p6);

运行结果:

再运行一次,结果:

 

 说明:

这里p5,p6 都是指向常量的常量指针,在定义的时候就完成了初始化。

对于p5来说,程序每次运行的时候,给变量i3 赋地址,p5的值就是i3的地址,他指向的值,即*p5,就是i3的值,即100;

前面提到,指向整型常量的常量指针,指针和指针指向的值,都不能变;

这里说的是,p5,*p5都是read-only,所以不能赋值,但是,直接给i3赋值,从而使*p5变化,是可以的。

而对于p6,因为指向的是i4,是整型常量,不能再次赋值的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值