指针 (二)

OKK,失踪人口回归昂兄弟们,时隔一个多月,终于能再次为诸君更新博客。这段时间为什么失踪呢?因为我放暑假头一个月跟同学打暑假工去了昂,体验体验生活,果然还是回到家躺着吹空调舒服啊,真是太累太累了。好了好了,话不多说,咱们继续指针的第二小节!

一 . 指针变量的意义

在上节博客中我们就提到过了指针变量,并且说了指针变量的大小与其类型无关,而是取决于平台地址,由于上一节过去的也比较久远昂,很多小伙伴可能已经忘了,没关系哈,诸君可以再回去看一看,巩固一下知识点,我这里吧网址和截图也是一起放在这儿:

上一篇博客:指针(一)-CSDN博客

由此可见,只要是指针变量,在同一个平台下,其大小都是一样的,那么这个时候有小伙伴就要提出疑问了,既然同平台下指针变量的大小都一模一样,那为什么还要有各种各样的指针类型呢?那是因为指针类型是具有特殊意义的,接下来我们深入了解

(1)指针的解引用

下面的两段代码,我们分别在调试的时候进行对比

不了解调试技巧的小伙伴呢,可以看一看之前总结的有关VS调试知识点的博客:

Visual Studio 的调试-CSDN博客

可以看到,在这一段代码中,将 n 的四个字节全部改为0

在这一段代码中,仅仅只将 n 的第一个字节改为了0

结论:这两者的代码为什么会有次差别呢?相信诸君也都观察到了。第一段代码中,我们用的是 *int 的指针的解引用,因为 int 是整型,它一次性能访问4个字节,而在第二段代码中,我们则用的是 *char 的指针的解引用,由于 char 是字符型,所以它一次性只能访问1个字节

(2)指针 + - 整数

话不多说,咱们直接用一段代码来给诸君演示:

从我们打印出来的地址可以很清楚地看到,char * 类型的指针变量 + 1 就是跳过 1 个字节,- 1 就是退后 4 个字节,而反观 int * 类型的指针变量 + 1 就是跳过 4 个字节,- 1 就是退后 4 个字节

结论:指针的类型决定了指针向前或者向后走一步的“ 距离 ”

(3)void * 指针

在我们指针类型中有一种特殊的类型:void * 类型,咱们可以将其理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接收任意类型的地址,这个时候有同学就要说了,那这个岂不是万能指针类型?这么好我们为什么不只用它呢?你看你又急,哪有完美的东西呢?它只是能接受任意类型的地址,但是它与一般指针相比,在其他方面也有所缺陷:void * 类型的指针不能直接进行指针的 + - 整数解引用运算,例如:

不使用 void * 指针时:

 如图,我们不能够从 int * 转换为 char * ,除非像图2中那样使用强转(强制类型转换),当然我们之前也提到过的是吧,强扭的瓜不甜,我们不到万不得已,应该避免使用强转,养成良好习惯是吧

使用 void * 指针时:

当我们使用 void * 来接收地址时,不管是任何指针类型,都不会有任何问题,但是缺点是其不能直接进行指针的运算操作

总结:void * 虽好,但不要 “ 贪杯 ” 哦,一般情况下我们 viod * 类型的指针是使用在函数参数的部分,以便于用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。让我们得以使用一个函数来处理多种类型的数据

二 . const 修饰指针

(1)const修饰变量

const :将变量修饰为常量

我们知道,变量变量,就是因为他是可以改变的量,当我们把变量的地址交给一个指针变量,通过这个指针变量我们也可以对该变量进行改动,但是当我们在某些特定条件下,希望这个变量不要再被改变了,我们就得给它加上一些限制,这个时候我们的 const 就该登场了

如图,以上就是我们 const 的一般用法,我们对已经被 const 修饰的变量进行修改,这样不符合C语言的语法规则,系统就会报错。这个时候有同学就要问了,有没有方法我们还可以去改变被 const 修饰的变量呢?当然有啦,我们打破表象看本质,绕过 b ,通过 b 的地址去对它做出修改即可(讲道理理论上这样子是可行的,但是我试了试VS上面还是不行,可能VS系统还是比较严谨哈,有条件的小伙伴们可以自己去其他的IDE试一试,或许可行)

(2)const 修饰指针变量

当我们 const 修饰指针变量的时候,将 const 放在 * 的左边和右边时,意义是不一样的。

我们可以通过控制变量法来体现 const 放在不同位置的意义:

总结:

(1)const 放在 * 的左边,修饰的是指针指向的内容,能够使指针指向的内容不能通过指针来改变,但是指针变量本身的内容可以被改变

(2)const 放在 * 的右边,修饰的是指针变量本身,能够使指针变量的内容不能被修改,但是指针指向的内容,可以通过指针改变

(3)* 左右都有 const 的情况下,指针变量本身和指针指向的内容都不能被修改

OKK,今天有关于指针的部分知识点就聊到这里啦,咱们下期再见(接下来会恢复大概两天一更的速度啦!)与诸君共勉!!!

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值