C++语言零基础入门教程:4.11 指针类型的初探分析

5374 人浏览 | 时间: 2016-08-27 20:55:18 | 作者: codexia

    我们在4.2-4.10节中,已经分析完了整型类型、字符类型、布尔类型。一般来说,这些类型已经可以很好的满足现实的需求了。你的信息基本都可以用这些类型表示出来,只是有些应用可能不是那么方便,但是至少可以表示。比如你的名字,可以用字符一个连起来表示,你的年龄可以用整数表示、你的工资可以用小数表示,你的性别可以用布尔表示。这些类型已经规划了绝大部分应用,至少我们常见的都可以表示。
    当然,现实世界是复杂的。能表示不代表容易表示,不表示可以方便的实现。所以,为了更加方便的解决现实需求,能够更好的更快更方便的表示现实中的各种信息,会创造很多各种各样的数据类型,每一个类型都可以很好的表示一类事物。比如我们有一类人叫做程序员。那么程序员也就成为了一类人的类别,为了方便的实现表示,我们肯定要用一个新类型来表示。程序员这个类型无法用整型、字符、布尔值来表示。这就是我们后面要讲的类。类是一个我们自定义的复合类型,也是C++的核心之一。后面会详细讲。
    当然在讲类之前,我们跨越了标准的复合类型。有了标准的符合类型定义,我们才可以自定义。不过在讲标准复合类型,我们需要了解最后一个基本类型,也就是指针类型。
    基本类型是最基础的类型,就和构成物质的最小单位一样,不能再细分的类型。而后面要讲的标准复合类型和自定义复合类型则是包装了我们现在讲的基本类型或者同时还会包含标准复合类型和自定义复合类型的复合类型。
    讲了这些,希望你对类型的分类有一个基本的认识。那么本节课讲指针类型。
    你可以看到,我们的教程和现存的书以及教程都不一样,我是按照事物的类别和演进关系来层层深入的,让你知道你学的每一个技术知识都是如何发挥作用的,他们为什么会出现,有什么用,如何用。如果你拿我们教程学习来考试,是不可取的。因为我们教程会让你思维变得灵活,这样会反而不适合考试。所以为了考试,千万别学我们的教程。如果想真的学技术,那就尽情学习吧,一定可以学到真正的技术的。
    指针是C语言的核心,是C语言的灵魂。但是,在C++语言中,指针只是C++的基础。C++衍生自C语言,但是发展巨大,青出于蓝而胜于蓝,而且最后都独成一派。C++的全能让C++无所不能,涵盖面之广,无人能及。但是这样让C++变得非常大,无所不包的强大让学习难度很高。但是,为了成就大神,不学C++如何变得和C++语言一样无所不能呢?当然,如果你是新手,你会觉得,自己能不能学会,能不能成为高手呢?放心,路在脚下,走,就对了。时间可以历练一个人!当然我们的教程也就是因此而诞生。我们教程尽可能的抽离技术的本质,让大家能够深入本质的学习,而且我们会让我们所学和技术本身发展关联讲解,这样技术就不只是理论上的说说而已了。当你掌握了本质后,你在使用熟悉后,就可以灵活运用,成为高手,最后自己提高为大神。
    好了。那么指针是一个什么类型呢?我们这里先讲讲指针的背景知识,后面再深入分析指针的实现的理解。
    指针代表的是一个东西的地址。指针这个类型是比较特殊的。你要使用一个东西,通常是将东西放在自己的手里,然后开始操作这个东西。比如球拍。在使用持有球拍的时候,你时刻都拥有着这个球拍,你要么是拿着这个球拍,或者背着,或者扛着。无论如何,在你操作这个球拍的时候,你始终要花着精力hold住这个拍。就算你不用这拍,也得拿着。因为你要是不拿着,就再也用不了它了。
    你可能会想到,如果你一直随身带着球拍,还不累死。你会想着,我需要用的时候,再去拿来用不就行了嘛。是的!那你肯定得先将这个球拍放在一个地方存放起来。这样就不用随身带了。假如你把这个球拍放在超市的寄存柜中。然后就随便去玩了。这样很轻松,没有负担了,确实很爽。问题是,此时你是无法使用球拍的了,因为不在手上了。如果你此时要使用球拍怎么办?去超市寄存柜取!是的。去超市寄存柜取!
    好了,到这里,很明显有两个问题了。第一个问题就是,我们很清楚,此时我们已经无法使用球拍了。第二个问题,要使用球拍,要先找到球拍,然后得有个地址才行,这个地址是存放了球拍的地址。第一个问题的情景表示我们丢失了球拍,无法即时使用球拍。第二个问题表示我们需要有正确的地址才能找到球拍,进而取得球拍来使用。
    第一个问题就是我们前面讲的基本类型的做法。不管是整型、字符还是布尔型,都是直接可以使用的。包括我们后面要将的复合类型,都是可以直接使用的。他们都可以归为一类类型,即直接存取类型。
    第二个问题则代表了一个全新的类型。我们肯定是得到了存放球拍的寄存柜的地址的,这样通过这个地址是可以找到球拍,并拿到球拍的。只是,我们不能直接操作球拍,需要先找球拍,然后才是操作球拍。如果地址弄错了,就再也找不到球拍了。虽然球拍是你的,但是球拍和你也就断开了联系了。所以,你和球拍这种关系是通过地址来维系的,如果地址出错,那么你们就断开了联系。
    第二个问题也就是对应的指针类型。指针类型也就是针对这样的需求发展而来的。所以你此时很清楚,指针起到的是指向作用。如果指向错了,也就是地址错了。地址错了会发生严重的问题,要么就是问题丢了球拍。要么就是闯入禁区去拿球拍,会被打的,或者是在错误的地方取到的不是球拍,而是其他东西。
    在事物的模型上,整型、字符类型、布尔类型、复合类型和指针类型是完全不同的类型。可以说完全是两个世界。指针类型只存放一个地址,这个地址指向你需要的东西。指针这个名词也就是这样来的。我有你家的地址,我就可以通过地址找到你家。你拥有你家,那是实实在在的一栋楼。你绝对不只是拥有你家的一个地址。你可以拥有你家的地址,当然还可以换成其他人的地址。所以,指针类型存储不同地址代表着不同的意义。我存储第一个地址,可能这个地址是一只猫,也可以是一栋楼,也可以是一条河。具体是什么,就要看指针存储的这个地址代表着什么意义。那么这个意义从哪里来呢?
    如果说,指针存储的一个地址值,那没有意义。你得赋予这地址意义。意义肯定得来自现实基础,比如我们说这个地址是建筑的地址,或者是树木的地址。而这些建筑或者树木反映到我们程序的基本数据类型中就是整型、字符、布尔或者复合类型。所以,我们赋予指针地址值的意义就是指向基本数据类型的东西的地址。比如指向一个数字的地址,或者指向一个字符的地址。
    所以,你可以看到,指针不能单从地址来看。一定要看指针地址所代表的意义哦。指针地址代表的意义至关重要,这也是指针的灵魂。要知道,指针这一块是C语言的灵魂,如果你不能够理解到实质,是很难灵活使用的。而要理解,也就是要透视事物的表现,看到内在隐含的思想模型。我们这里就将指针类型以球拍的使用为例,从基本类型引入指针,重点描述了指针地址的意义。
    用我们社会上的一句话来描述指针地址的意义,就是,不同的出身地址和环境, 造就不一样的人生。如果降生在富人家庭,你会天生有优势。如果降生在穷人家庭,你会天生很悲催。不同的类型也决定一个人的发展方向,无法抗拒。同样,指针的地址就好比刚降生的你,你只是一个肉体驱壳,在不同的地方出身,你也就赋予了不同的含义。当然,你也可以切换你自己的含义,可以让自己变成穷人,也可以让自己努力变成富人。所以,在指针的世界里,有无限种可能。所以指针的魔力也是最吸引人的地方。但是如果没有背后的含义,指针啥也不是。
    我们这里提到的指针,是指针这个类别的统称,赋予不同含义的指针有不同的含义。就好比穷人是一个统称,而穷人有很多种穷。
    那么看完这节课,你如果知道“指针和普通基本数据类型不一样,知道指针地址需要赋予不同的含义才有意义,知道指针赋予的含义可以随时改变以及指针的地址是维系主人和物品之间的关系的关键,丢失了地址会导致丢失物品”,那就差不多了。这节课也是启蒙性质的,是你认识指针的第一步。所以,会有点朦胧,这就可以了,后面随着细化,你会越来越清晰。这节课不能够跳过,否则后面很难理解指针,也很难和现实世界关联起来。

    在后面讲解指针和其他各种类型的混合使用,特别是数组的时候,非常容易混乱。所以从这里开始就要细细的消化。最后附上一张图,这是我们上次C++技术网举行的程序员交流大会的地址:

【深圳红树林海滨生态公园地址】
    看到没,我们没有拥有这个公园,只是拥有它的地址。有了地址我们可以随时去。如果地址搞错或者丢了就找不到这个点的位置。当然如果将这个地图换成外星地图,那么这个点必然不是公园了。所以地址的意义很重要。
请微信扫码阅读
为防止恶意爬虫,
已开启反爬机制