const修饰指针

       上篇我讲到了指针变量和地址操作符,本篇我来继续深入讲解指针的知识点,本篇讲也是讲两个知识点

1. 指针变量类型的意义
2. const修饰指针

1.指针变量类型的意义

       指针变量的大小和类型无关,只要是指针变量,在同⼀个平台下,大小都是⼀样的,为什么还要有各种各样的指针类型呢?
      
       其实指针类型是有特殊意义的,我们接下来继续学习。

1.1指针的解引用

对比下面的两段代码不同之处,观察调试时内存的不同变化

        通过调试我们可以看到,左侧的代码会把4给字节全部改为0,而右侧的却只会将一个字节更改为0。

结论:指针类型决定了,对指针解引用的时候能有多大的权限(即一次能操作几个字节)。

1.2指针 + - 整数

        先看一段代码,并调试观察地址的变化。

代码的运行结果如下:

        我们可以看出 int * 变量访问了4个字节,而 char * 变量只访问了一个字节。这就是指针变量类型差异所带来的变化。

结论:指针的类型决定了指针向前或者向后走一步有多大(距离)。

1.3void*指针

        我们都知道指针变量类型有整形int  *,短整型short *,浮点型float * ,字符型char *4种类型,每一个都可以访问不同的字节,可是从一种类型到另一种类型的时候,却会出现如下图所示情况:

        可见用另一种类型接收地址编译器是不兼容的,这时我们就要用到一个新的指针类型

那就是void * 指针

        可见无论是什么类型,使用void * 指针都不会出现兼容性错误。因此需要存放地址的时候,都可以使用void * 指针。

但是void * 指针有一个问题,不能进行解引用和指针+ - 整数!!!

        如上图所示可以使用void * 存放各种地址,解引用指针pa的时候会出现报错(非法的间接寻址),所以无法使用void *指针变量直接进行运算。

2.const修饰指针

2.1const修饰变量

        我们都知道变量是可以修改的,把一个变量的地址交给一个指针变量的时候,通过指针变量也可以修改变量。如果我们希望给变量加上一个限制让它不能被修改的话,就需要用到const了。

上述代码中a是可以被修改的,而b是不可被修改的,可见const在修饰变量时可以让常量不能被修改,但b本质上还是一个变量。

结论:const修饰变量时会把变量变为常变量

        但是如果我们绕过b,使⽤b的地址,去修改b就能做到了,虽然这样做是在打破语法规则。

        上述图片结果可以看到这里有一个变量确实被修改了,但是这样子n被const修饰不就没有意义了吗?这样子是不合理的,所以应该让p拿到a的地址也不能修改a的值,那应该怎么做呢?这就要来到下一个知识点:const修饰指针变量。

2.2const修饰指针变量

我们先来看下面两段代码:

        上述代码左侧图片是指针 * 在const左边的时候出现的情况,右侧图片是指针 * 在const右边的时候出现的情况。
我们再来看一组代码:
        当两边都存在const的时候,可以看见无论是指针变量本身还是指针指向的内容都是不能改变的。
结论:const修饰变量的时候:
const如果放在*的左边,修饰的是指针指向的内容,那么指针指向的内容不能改变,但是指针变量的内容可以改变。
const如果放在*的右边,修饰的是指针变量本身,那么指针变量的内容不能改变,指针指向的内容可以改变。
const如果放在*的两边,那么修饰的就是指针指向的内容和指针变量本身,那么指针指向的内容和指针变量都不可以改变。

这些就是我本篇要讲的所有知识点了,希望这些对你们能够有所帮助

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值