float初始化_指针 (五)指针的初始化与多重指针

这段时间比较忙,我就简单阐述一点点自己对于指针的初始化以及多重指针的想法。如果说的有什么不对的地方,欢迎指出!

“野指针”这个概念,可能很多和我一样的初学者都有耳闻。我们往往只是知道不能让自己的程序出现“野指针”,却不清楚为什么。这也算是一种知其然而不知其所以然吧。

我们先来看看度娘是如何精确定义“野指针”这个概念的:

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。(节选自百度百科)
野指针_百度百科​baike.baidu.com
015e08d56aa39397c8dea2bb36a7a857.png

那么,“野指针”又会有什么危害呢?在众多bug里,为何“野指针”会如此出名?

看上面的定义,一个指向未知位置的指针,如果我们擅自访问,甚至修改,这可是可能会带来严重后果的——轻则死机,重则变砖。不过一般而言,编译器是不会让我们定义一个指向不明的指针的——但是“偶尔”、“万一”出现了允许通过的情况(比如说随机访问的那个地址是合法的),那就算是虎入羊群了。

更多关于野指针的危害,还可以看看这里:

野指针危害真的很大吗?​www.zhihu.com

其实对于我们初学者而言,防止野指针的出现有一个十分简单的方法,就是初始化指针指向NULL。指向NULL的指针,又称为空指针,含义就如同字面所说,一个不指向任何地址的指针。各位可以把指针想象为一把枪,枪威力巨大但可能走火(野指针),所以“上保险”(NULL)就是一个明智的选择了。

在实际开发过程中(对初学者而言是写作业过程中2333),初始化指针不知道需要指向何处的时候,先将它指向“NULL”,是一个永远都不会错的选择。

再补充一个小例子,我们来看看所谓的“空指针”究竟指向哪里:

#include 

b8daf77be5a9ece047cfb5be6562dcff.png

这个指向“000...”的指针,就是所谓的空指针啦。其实也并非完全如同上面所说是一个“空”的指针。“00...00”这个特殊的位置,就是专门预留给NULL指针的。


接下来稍微谈谈多重指针的问题吧。

最常见的多重指针,也就是二重指针,最基础定义无疑是“指向指针的指针”。

代码示例先行给出:

#include 

多重指针的定义在了解了指针的概念之后,它就并不难理解了。多重指针的难点在于如何应用在实际程序中。(只是为了应付大学考试的盆友,收手吧,到这就足够了。把时间留给函数不香嘛)

不过肯定还有和我一样爱折腾的同学(抖m狂欢),还是想深入了解一下指针的。毕竟,不看考试的话,指针才是C语言的灵魂所在啊~~

不过笔者本人接触的例子也不多,这里就拿前两天看到的一个“指向数组指针的指针”为例子吧。

#include 

12d4dc2533c37282da2e56aa1279c5f7.png

这里笔者使用了前几章中谈到过的“数组指针”。用二重指针加上多重解引用的方法,就可以对数组指针的字符串中单个元素进行逐个访问。

(顺带一提,使用数组语法糖也可以达到相同的结果。笔者在这里就不再赘述了)

现在笔者这方面的了解还不够多。等到详细学习了函数之后,再来进一步补充指针的“高级用法”吧。


对了,开头既然谈到了“NULL指针”,那么不妨再谈谈一些其它的特殊的指针吧。

void 指针:

所谓的“通用指针”。“void”翻译为“空、虚空”。我们定义变量的时候,不同类型的数据在内存中占据不同的大小(例如char类型占1字节, int、float类型占4字节、 double类型占8字节)而void的“0”就显然是玩法像其它变量一样初始化的。

但是到了指针就不一样了。void指针大名“通用指针”,任何的指针都可以赋值给通用指针,也就是void指针。

不过依然存在一个问题:原本编译器是知道数据类型的,它就“知道”要接着地址读取几个字节,才能“拿出”正确的数据。我们要解引用void指针的时候,需要先强制转换指针类型。

#include 

342461a1cb829ee733e478fa5c89e99b.png

有一说一这样真的麻烦......所以在现阶段了解就行,不要多用吧。(想装b的当我没说)void指针据说在一些其它我们还没有学习的领域有一些妙用,等等时候我就来更新它的知识点~~

那行,这次的知识分享就到这里结束了。本人也是一名初学者,错误在所难免,也欢迎各位指出我的错误!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值