卡尔·维特根斯坦

title: 历史.
content: 在1964年,哈罗德·劳森发明了最早的指标。他在PL/I中实作出了这个概念,其他高级程序语言也很快跟进,使用了这个想法。指标(英语:pointer)这个名称首次出现在系统发展公司(英语:System Development Corporation,SDC)的技术文件,当中使用了堆叠指标(英语:stack pointer)这个名词。
title: 概论.
content: 在计算机科学中,指标是一种最简单形式的参照(reference)。  指针有两种含义,一是作为数据类型,二是作为实体。前者如字符指针、浮点指针等等;后者如指针对象、指针变量等。  指针作为数据类型,可以从一个函数类型、一个对象类型或者一个不完备类型中导出。从中导出的数据类型称之为被引用类型(referenced type)。指针类型描述了一类的对象,对象值为对被引用类型的实体的引用。  C++标准中规定,“指针”概念不适用于成员指针(不包含指向静态成员的指针)。C++标准规定,指针分为两类:
title: 指针的实质.
content: C99与C++11标准分别明确规定了把一个指针值转换自(from)/成(to)整形是允许的,但整型的大小至少不低于codice_1。  在C语言的多数实现中,指针值是一个以当前系统寻址范围为取值范围的整数。  32位系统的寻址能力(地址空间)是4GB(0~2-1),以二进制表示时长度为32位元,每格储存空间是1 Byte。不难验证,在32位系统的大多数实现里,codice_2类型也正好是32-bit长度,可以取遍上述范围。  同理,64位系统取值范围为0~2-1,codice_2类型长度为64-bit。
title: 使用指针的目的.
title: 简化代码.
content: 如果没有指针,很难用一个统一的模式去codice_4的定位并修改一棵树的结点。例如:不用指针要修改codice_4的左子树的左子树的右子结点,只有“codice_6”一种表达方式,不能通过赋值而简化。
title: 参数传递.
content: C中函数调用是按值传递的,传入参数在子函数中只是一个初值相等的副本,无法对传入参数作任何改动。但实际编程中,经常要改动传入参数的值。在C语言中一般通过传入参数的地址而不是原参数本身来实现。当对传入参数(地址)取“codice_7”运算时,就可以直接在内存中修改,从而改动原想作为传入参数的参数值。  在执行codice_8;时,操作codice_9,即是在操作codice_10了。  以下例子中,codice_11内的变量从来没有改变,改变的只是codice_12内的变量。 codice_12执行完毕后,其内容会自动删除。
title: 指针的运算和声明.
title: 取地址和取值运算.
content: 取值运算(codice_14)返回保存在内存地址为codice_15的内存空间中的值。取地址(codice_16)运算则返回操作数codice_15的内存地址。显然可以用赋值语句对内存地址赋值。  假设一段内存地址空间取值如下:(十六进制)  然后,执行代码“codice_18”,假设初始化时codice_15被分配3001H、3002H两个地址。则codice_15为2003H,codice_14为3000H。  则codice_22、codice_23、codice_24和codice_25的值分别为:  codice_260020H。  codice_27,出错,3001H是常数,无地址可言。  codice_28=2003H,也即codice_29。  codice_30,出错,3000H是常数,无地址可言。
title: 指针的复杂形式.
title: 双重指针(指向指针的指针).
content: 双重指针是指向指针的指针,它是一个指针,这个指针指向某个内存地址,该地址的值是一个指针,指向给另一个内存地址(通常异于前者,但不排除二者相等)。  本质上,指针值就是内存地址。但为了防范指针值被滥用(如内存访问时越界),可以规定指针类型为强类型,即指针值及保存在该内存地址的对象的类型。双重指针不过是这种强类型的一个应用:该地址空间长度为一个指针长度(4或8字节),对象类型为另一种指针。
title: 指针数组.
content: 指针数组:就是一个数组,数组的各个元素都是指针值。
title: 数组指针.
content: 数组名出现在表达式中时,绝大多数情况(除了数组名作为sizeof的操作数或者作为取地址&元素符的操作数)会被隐式转换为指向数组的首个元素的指针右值。  当数组名作为取地址&运算符的操作数,则表达式的值为指向整个数组的指针右值。  例子:  根据上述C语言标准中的规定,表达式 &s 的值的类型是char (*)[6],即指向整个数组的指针;而表达式 s 则被隐式转换为指向数组首元素的指针值,即 char* 类型。同理,表达式 s[4],等效于表达式 *(s+4)。
title: 指向函数的指针.
content: 指向函数的指针:不同于指向数据类型的指针,函数指针指向一段可执行的代码的首地址,这段代码仍然占用了一块内存空间。,因为它最多只有结构体的定义,而没有类的概念。根据本段所述,可以认为C语言能成为面向对象的语言,只是表述比较麻烦而已。事实上很多开源程序都使用这种方式组织他们的代码。
title: 指标的进化与取代.
content: 由于指标太活跃,因此导致它几乎能不受限制的在各种内存位址间活动,所以一旦有任何重复、重叠、溢位的情形发生时,电脑便直接当机,这成为指标功能上的最大缺憾。因此在新的网络程序语言的开发上,新的语言如Java、C#等语种已经取消了指标的无限制使用形式。 C#允许指标的有限功能的使用,指标和运算指标在一个操作的环境中是存在潜在的非安全性的,因为他们的使用可以避开对象的一些严格访问规则。C#中使用指标的代码段或者方法的地址要用unsafe关键字进行标记,这样,这些代码的使用者就会知道这个代码相比其他的代码而言是不具有安全性的。编译器需要unsafe关键字时将使用此代码的程序转换成是允许被编译的。一般来说,不安全代码的使用可能是为了非托管的API(应用程序编程接口)的更好互用,或者是为了(存在内在不安全性的)系统调用,也有可能是出于提高性能等方面的原因。而Java中不允许指标或者算术指标的使用。

Summary: 卡尔·维特根斯坦(,1847年-4月8日-1913年-1月20日)是奥匈帝国晚期奥地利最成功的企业家之一,他被看作是当时时期的一名代表人物,是哲学家路德维希·维特根斯坦和钢琴家保罗·维特根斯坦的父亲。

Karl Wittgenstein: Karl Otto Clemens Wittgenstein (April 8, 1847 – January 20, 1913) was a German-born Austrian steel tycoon of Jewish origin. A friend of Andrew Carnegie, with whom he was often compared, at the end of the 19th century he controlled an effective monopoly on steel and iron resources within the Austro-Hungarian Empire, and had by the 1890s acquired one of the largest fortunes in the world. He was also the father of concert pianist Paul Wittgenstein, philosopher Ludwig Wittgenstein and of philanthropist Margaret Stonborough-Wittgenstein.