这段时间比较忙,我就简单阐述一点点自己对于指针的初始化以及多重指针的想法。如果说的有什么不对的地方,欢迎指出!
“野指针”这个概念,可能很多和我一样的初学者都有耳闻。我们往往只是知道不能让自己的程序出现“野指针”,却不清楚为什么。这也算是一种知其然而不知其所以然吧。
我们先来看看度娘是如何精确定义“野指针”这个概念的:
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。(节选自百度百科)野指针_百度百科baike.baidu.com
那么,“野指针”又会有什么危害呢?在众多bug里,为何“野指针”会如此出名?
看上面的定义,一个指向未知位置的指针,如果我们擅自访问,甚至修改,这可是可能会带来严重后果的——轻则死机,重则变砖。不过一般而言,编译器是不会让我们定义一个指向不明的指针的——但是“偶尔”、“万一”出现了允许通过的情况(比如说随机访问的那个地址是合法的),那就算是虎入羊群了。
更多关于野指针的危害,还可以看看这里:
野指针危害真的很大吗?www.zhihu.com其实对于我们初学者而言,防止野指针的出现有一个十分简单的方法,就是初始化指针指向NULL。指向NULL的指针,又称为空指针,含义就如同字面所说,一个不指向任何地址的指针。各位可以把指针想象为一把枪,枪威力巨大但可能走火(野指针),所以“上保险”(NULL)就是一个明智的选择了。
在实际开发过程中(对初学者而言是写作业过程中2333),初始化指针不知道需要指向何处的时候,先将它指向“NULL”,是一个永远都不会错的选择。
再补充一个小例子,我们来看看所谓的“空指针”究竟指向哪里:
#include
这个指向“000...”的指针,就是所谓的空指针啦。其实也并非完全如同上面所说是一个“空”的指针。“00...00”这个特殊的位置,就是专门预留给NULL指针的。
接下来稍微谈谈多重指针的问题吧。
最常见的多重指针,也就是二重指针,最基础定义无疑是“指向指针的指针”。
代码示例先行给出:
#include
多重指针的定义在了解了指针的概念之后,它就并不难理解了。多重指针的难点在于如何应用在实际程序中。(只是为了应付大学考试的盆友,收手吧,到这就足够了。把时间留给函数不香嘛)
不过肯定还有和我一样爱折腾的同学(抖m狂欢),还是想深入了解一下指针的。毕竟,不看考试的话,指针才是C语言的灵魂所在啊~~
不过笔者本人接触的例子也不多,这里就拿前两天看到的一个“指向数组指针的指针”为例子吧。
#include
这里笔者使用了前几章中谈到过的“数组指针”。用二重指针加上多重解引用的方法,就可以对数组指针的字符串中单个元素进行逐个访问。
(顺带一提,使用数组语法糖也可以达到相同的结果。笔者在这里就不再赘述了)
现在笔者这方面的了解还不够多。等到详细学习了函数之后,再来进一步补充指针的“高级用法”吧。
对了,开头既然谈到了“NULL指针”,那么不妨再谈谈一些其它的特殊的指针吧。
void 指针:
所谓的“通用指针”。“void”翻译为“空、虚空”。我们定义变量的时候,不同类型的数据在内存中占据不同的大小(例如char类型占1字节, int、float类型占4字节、 double类型占8字节)而void的“0”就显然是玩法像其它变量一样初始化的。
但是到了指针就不一样了。void指针大名“通用指针”,任何的指针都可以赋值给通用指针,也就是void指针。
不过依然存在一个问题:原本编译器是知道数据类型的,它就“知道”要接着地址读取几个字节,才能“拿出”正确的数据。我们要解引用void指针的时候,需要先强制转换指针类型。
#include
有一说一这样真的麻烦......所以在现阶段了解就行,不要多用吧。(想装b的当我没说)void指针据说在一些其它我们还没有学习的领域有一些妙用,等等时候我就来更新它的知识点~~
那行,这次的知识分享就到这里结束了。本人也是一名初学者,错误在所难免,也欢迎各位指出我的错误!