const int * p 和 int const * p 和 int * const p 的区别

为什么要引入const?

const的英语意思是常量,顾名思义,就是指不能被修改的量,但是它是用来修饰变量的,因为常量例如1,2,本身就在内存中的常量区,是只读的。所以const限制的是我们自己定义的变量不被自己修改。举个栗子:我们想自定义一个缓冲区的大小为512,而且这个大小是固定的,因此我们就可以这样声明:const int bufsize = 512;那有没有疑问呢?为什么不用#define啊?

#defineconst的区别?

  • #define是在预处理的时候处理的,直接将相应的内容用其对应的数值替换。但是const是在编译的时候处理的。
  • #define不会为变量分配相应的内存空间,但是const会,并且const还可以指明变量的类型,这样非常有助于编译器为我们检查语法错误。

下面我们再看我们最初的问题:

>首先注意,const int *pint const *p 是一样的,并且不管是不是*p,即使const int iint const i也是一样的,所以我们接下来只讨论int const *pint * const p的不同

对于这种问题,我们只用将const 的位置固定,然后再看后面的类型,一般规则是const后面的类型不能在直接进行赋值或者修改.例如下面:

#include<stdio.h>

int main(int argc,char *argv[])
{
    int i = 10;
    int j = 1;
    int const *p2 = &i;
    int *const p3 = &j;
    p2 = &j;             //这句没问题,因为const是对 *p2 进行限制的
    *p3 = 20;            //这句也没问题,同理,const是对p3进行操作的
    *p2 = 30;            //这句错了,原因就是已经用const修饰了,不能再次改
    p3 = &j;             //同上,错误
    return 0;

}

我们编译下再看下效果:
这里写图片描述
错误提示:”read-only”,现在有没有对这个问题有理解呢,觉得const怎么样呢?那么我再说一个问题,不知道为什么的问题:

#include<stdio.h>

int main()
{
    const int a = 5;
    int *p = (int *)&a;
    *p = 10;
    printf("a:%d\n",a);
}

这里写图片描述

对,这个结果可是让我吃惊了,为什么呢?欢迎评论交流.

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨博东的博客

请我喝瓶可乐鼓励下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值