欢迎来到天天文库
浏览记录
ID:32562686
大小:189.80 KB
页数:32页
时间:2019-02-12
《数组和指针概念的联系与区分的经典》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、第一章数组与指针概念剖析数组与指针生来就是双胞胎,多数人就是从数组的学习开始指针的旅程的。在学习的过程中,很自然就会经常听到或见到关于数组与指针的各种各样的看法,下面我节选一些在各种论坛和文章里经常见到的文字:“一维数组是一级指针”“二维数组是二级指针”“数组名是一个常量指针”“数组名是一个指针常量”........................这些文字看起来非常熟悉吧?类似的文字还有许多。不过非常遗憾,这些文字都是错误的,实际上数组名永远都不是指针!这个结论也许会让你震惊,但它的确是事实。但
2、是,在论述这个问题之前,首先需要解决两个问题:什么是指针?什么是数组?这是本章的主要内容,数组名是否指针这个问题留在第二章进行讨论。看到这里,也许有人心里就会嘀咕了,这么简单的问题还需要说吗?int*p,a[10];不就是指针和数组吗?但是,笔者在过往的讨论过程中,还真的发现有不少人对这两个概念远非清晰,这会妨碍对后面内容的理解,所以还是有必要先讨论一下。什么是指针?一种普遍存在的理解是,把指针变量理解成就是指针,这种理解是片面的,指针变量只是指针的其中一种形态,但指针并不仅仅只有指针变量。一个
3、指针,包含了两方面的涵义:实体(entity)和类型。标准是这样描述指针类型的:6.2.5TypesApointertypemaybederivedfromafunctiontype,anobjecttype,oranincompletetype,calledthereferencedtype.Apointertypedescribesanobjectwhosevalueprovidesareferencetoanentityofthereferencedtype.Apointertypeder
4、ivedfromthereferencedtypeTissometimescalled‘‘pointertoT’’.Theconstructionofapointertypefromareferencedtypeiscalled‘‘pointertypederivation’’.请留意第二句所说的内容:指针类型描述了这样一个对象,其值为对某种类型实体的引用。标准在这里所用的措词是指针类型描述了一个对象。再来看看标准关于取址运算符&的规定:6.5.3.2Addressandindirectiono
5、peratorsSemanticsTheunary&operatorreturnstheaddressofitsoperand.Iftheoperandhastype“type”,theresulthastype“pointertotype”.......Otherwise,theresultisapointertotheobjectorfunctiondesignatedbyitsoperand.这个条款规定,&运算符的结果是一个指针。但问题是,&表达式的结果不是对象!标准自相矛盾了吗?当然不
6、是,这说明的是,指针的实体有对象与非对象两种形态。我们常说的指针变量只是指针实体的对象形态,但对象与非对象两种形态合起来,才是指针的完整涵义,就是说,无论是否对象,只要是一个具有指针类型的实体,都可以称之为指针,换言之,指针不一定是对象,也不一定是变量。后一种情况,指的是当需要产生一个指针类型的临时对象时,例如函数的传值返回或者表达式计算产生的中间结果,由于是一个无名临时对象,因此不是变量。在C++中,由于引入了OOP,增加了一种也称为“指针”的实体:类非静态成员指针,虽然也叫指针,但它却不是一
7、般意义上的指针。C++标准是这样说的:3.9.2Compoundtypes.......Exceptforpointerstostaticmembers,textreferringto“pointers”doesnotapplytopointerstomembers..........接下来,该谈谈数组了。数组是一种对象,其对象类型就叫数组类型。但笔者发现有个现象很奇怪,有些人根本没有数组类型的意识,不过也的确有些书并没有将数组作为一个类型去阐述,也许原因就在于此吧。数组类型跟指针类型都属于派生
8、类型,标准的条款:6.2.5TypesAnarraytypedescribesacontiguouslyallocatednonemptysetofobjectswithaparticularmemberobjecttype,calledtheelementtype.Arraytypesarecharacterizedbytheirelementtypeandbythenumberofelementsinthearray.Anarraytypeissaidtobederivedfromitsel
此文档下载收益归作者所有