OKK,失踪人口回归昂兄弟们,时隔一个多月,终于能再次为诸君更新博客。这段时间为什么失踪呢?因为我放暑假头一个月跟同学打暑假工去了昂,体验体验生活,果然还是回到家躺着吹空调舒服啊,真是太累太累了。好了好了,话不多说,咱们继续指针的第二小节!
一 . 指针变量的意义
在上节博客中我们就提到过了指针变量,并且说了指针变量的大小与其类型无关,而是取决于平台地址,由于上一节过去的也比较久远昂,很多小伙伴可能已经忘了,没关系哈,诸君可以再回去看一看,巩固一下知识点,我这里吧网址和截图也是一起放在这儿:
上一篇博客:指针(一)-CSDN博客
由此可见,只要是指针变量,在同一个平台下,其大小都是一样的,那么这个时候有小伙伴就要提出疑问了,既然同平台下指针变量的大小都一模一样,那为什么还要有各种各样的指针类型呢?那是因为指针类型是具有特殊意义的,接下来我们深入了解
(1)指针的解引用
下面的两段代码,我们分别在调试的时候进行对比
不了解调试技巧的小伙伴呢,可以看一看之前总结的有关VS调试知识点的博客:
可以看到,在这一段代码中,将 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,今天有关于指针的部分知识点就聊到这里啦,咱们下期再见(接下来会恢复大概两天一更的速度啦!)与诸君共勉!!!