数组和指针概念联系与区分的经典文档.docVIP

  • 2
  • 0
  • 约4.42万字
  • 约 32页
  • 2016-10-12 发布于贵州
  • 举报

数组和指针概念联系与区分的经典文档.doc

数组和指针概念联系与区分的经典文档

第一章 数组与指针概念剖析 数组与指针生来就是双胞胎,多数人就是从数组的学习开始指针的旅程的。在学习的过 程中,很自然就会经常听到或见到关于数组与指针的各种各样的看法,下面我节选一些 在各种论坛和文章里经常见到的文字: “一维数组是一级指针” “二维数组是二级指针” “数组名是一个常量指针” “数组名是一个指针常量” ........................ 这些文字看起来非常熟悉吧?类似的文字还有许多。不过非常遗憾,这些文字都是错误 的,实际上数组名永远都不是指针!这个结论也许会让你震惊,但它的确是事实。但是, 在论述这个问题之前,首先需要解决两个问题:什么是指针?什么是数组?这是本章的 主要内容,数组名是否指针这个问题留在第二章进行讨论。看到这里,也许有人心里就 会嘀咕了,这么简单的问题还需要说吗?int *p, a[10];不就是指针和数组吗?但是, 笔者在过往的讨论过程中,还真的发现有不少人对这两个概念远非清晰,这会妨碍对后 面内容的理解,所以还是有必要先讨论一下。 什么是指针?一种普遍存在的理解是,把指针变量理解成就是指针,这种理解是片面的, 指针变量只是指针的其中一种形态,但指针并不仅仅只有指针变量。一个指针,包含了 两方面的涵义:实体(entity)和类型。标准是这样描述指针类型的: 6.2.5 Types A pointer type may be derived from a function type, an object type, or an incomplete type, called the referenced type. A pointer type describes an object whose value provides a reference to an entity of the referenced type. A pointer type derived from the referenced type T is sometimes called ‘‘pointer to T’’. The construction of a pointer type from a referenced type is called ‘‘pointer type derivation’’. 请留意第二句所说的内容:指针类型描述了这样一个对象,其值为对某种类型实体的引 用。标准在这里所用的措词是指针类型描述了一个对象。 再来看看标准关于取址运算符的规定: 6.5.3.2 Address and indirection operators Semantics The unary operator returns the address of its operand. If the operand has type “type”, the result has type “pointer to type”....... Otherwise, the result is a pointer to the object or function designated by its operand. 这个条款规定,运算符的结果是一个指针。但问题是,表达式的结果不是对象!标准 自相矛盾了吗?当然不是,这说明的是,指针的实体有对象与非对象两种形态。 我们常说的指针变量只是指针实体的对象形态,但对象与非对象两种形态合起来,才是 指针的完整涵义,就是说,无论是否对象,只要是一个具有指针类型的实体,都可以称 之为指针,换言之,指针不一定是对象,也不一定是变量。后一种情况,指的是当需要 产生一个指针类型的临时对象时,例如函数的传值返回或者表达式计算产生的中间结 果,由于是一个无名临时对象,因此不是变量。 在C++中,由于引入了OOP,增加了一种也称为“指针”的实体:类非静态成员指针,虽然 也叫指针,但它却不是一般意义上的指针。C++标准是这样说的: 3.9.2 Compound types ....... Except for pointers to static members, text referring to “pointers” does not apply to pointers to members.......... 接下来,该谈谈数组了。数组是一种对象,其对象类型就叫数组类型。但笔者发现有个 现象很奇怪,有些人根本没有数组类型的意识,不过也的确有些书并没有将数组作为一 个类型

文档评论(0)

1亿VIP精品文档

相关文档