参照

计算机科学中,参照英语:)是指一个可以让程序间接访问于电脑内存或其他保存设备中一特定数据的,该数据可以为变量记录

参照和数据本身不同。一般而言,参照会是数据保存于内存或保存设备中的实体地址。因此,参照亦常被称为该数据的指针地址。不过,参照也被用来指数据地址和某一固定「基准」地址的偏移值,或是数组的索引。

参照的概念和其他如关联键识别字之类用来识别特定数据项目的值不同,后者只能通过数据库表中的寻找运算,来访问数据。

参照被广泛用于编程之中,尤其是用于将大量或易变的数据有效地通过参数传给子程序,或在不同的用途中共享此类数据。此外,参照也能指向一个包含其他数据之参照的变量或记录,此一概念为间接寻址链接数据结构(如链表)之基础。

例子

指针是最简单的参照,由于和底层硬件的亲密关系,使其成为最强大及有效的参照之一。不过,也因为此一关系,程序员在使用指针时,必须非常了解内存架构的细节。因为指针保存内存的地址,而非直接保存值,不正常地使用指针会导致程序出现未定义行为智能指针是一个非透明指针,作用和指针相似,但只能通过特定方式访问。

句柄是一种抽象参照,可用许多不同方法呈现。其中一个常见的例子为文件句柄(用于C语言标准输入/输出函数库中的文件数据结构 ),用来描述抽象的文件内容。文件句柄通常可用来表示文件本身(当要求该文件的时),以及文件内容中的某一特定位置(当读存该文件时)。

分布式计算中,参照可能包含一个以上的地址或识别字;也可能包括用来定位或访问参照对象之网络协定的编码格式,用来说明消息被编码或串行化之方式。举例来说,WSDL中对远程网络服务的描述可被视为一种参照,包括如何定位及绑定特定Web服务之完整格式。另一个例子为对即使分布式对象的参照:该参照为一个如何建设称之为「代理(proxy)」之小型软件组件的完整格式,此代理接着会运行点对点(peer-to-peer)的交互,并使本地机器得以访问被复装或只存在部分一致之消息串流的数据。

编程语言的支持性

在第一个被使用的编程语言-汇编语言中,一般使用未处理的内存地址或数组中的索引表示参照。这样使用是可行的,但有点微妙,因为一个地址无法告诉你它指向的值是什么,更不用说这个值有多大,或是该如何解释;此类消息都内含在程序的逻辑之中。如此一来,误解将可能出现在不正确的程序里,引发令人感到困惑的错误。

最早的不透明参照为LISPCONS函数,此一函数只是一个包含两个参照至其他Lisp对象的记录,其他Lisp对象也可能包括其他的cons函数。此一简单的结构最常被用来建构单向链表,但也可用来建构简单的二元树,以及一种被称为「点状串列」的结构,该结构最终会终止于一个值上,而非空参照。

另一个早期的语言-Fortran则没有明确用来表示参照的用法,但可以传参照调用的方式使用参照。

指针依然是今日最常见的一种参照,类似于汇编语言中对未处理内存地址的表示方式,不同之处在于指针带有一个固定之数据类型,可在编译期间用来确保所指之数据不被误解。不过,因为C语言有个可以使用类型转换(在不同指针类型间及指针类型与整数间转换)的弱类型系统,虽然较为困难,但还是有可能误解。C++试图在C++标准程序库中使用新的cast操作符及较聪明的指针,以增加类型安全;但为了兼容性,仍保留绕过这些安全机制的能力。

许多今日常见的主流语言,如EiffelJavaC#Visual Basic等,则均采用了一种更加不透明的参照,通常即简称为「参照」。此类参照具有类似C语言指针的类型,会指出其所参照数据的意思;不过,此类参照为类型安全的,无法指向一个未处理的地址,以及进行不被允许的不安全转换。

参照与指针的区别

对于同时支持参照与指针的C/C++,两类数据型的区别有:

  • 指针可以重新赋值,而参照在初始化绑定后就不能再绑定到其他对象。
  • 指针对象有它自己的内存地址与内存长度,而参照与它指向的对象具有相同的内存地址、内存长度。因此,可以把参照看作是被指向对象的另一个名字。
  • 指针可以指向另一指针,因此允许多层的指针间址(indirection);而参照只允许到对象的一层间址,不允许“参照的参照”。
  • 指针可以直接赋值为NULL,参照不能。当然,可以费劲办法把参照绑定到内存的NULL上,但这并不实用。
  • 指针可以在数组上遍历(iterate),参照不能。
  • 指针需要用运算符“*”来解参照(dereference)以访问它所指向的内存的内容;参照不需要显式解引用。指向类/结构的指针访问成员变量/成员函数需要用运算符->而参照使用运算符.来访问成员。
  • 指针是一个变量,保存了内存地址;而C++标准都没有明说参照是如何实现的。实际上,几乎所有C++编译器把参照作为一个隐式的指针来实现。
  • 指针可以成为数组的成员类型,即指针数组;但参照不可以作为数组的成员类型,即不存在“引用数组”。
  • const参照可以绑定到临时对象;而指针不能(例如,int *y = 12;编译出错)。按照C++11语法,const左值引用可以绑定到一切对象,包括const左值对象,非const左值对象,const临时对象,非const临时对象;右值参照当然可以绑定到临时对象。

参考文献

    参见

    This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.