Sign in Join
Wiki copytemporary

Basic Pascal Tutorial/Chapter 5/Pointers/zh CN: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Basic Pascal Tutorial/Chapter 5/Pointers/zh CN

OldNewLine
1+5F -指针类型 (原作者: Tao Yue, 状态: 未更改)
2+
3+指针是一种数据类型,它拥有一个内存地址。指针可以被看作是内存地址的引用,在存取变量时直接访问内存地址。如果变量是某人的电话号码,那么,指针存储的是,它在电话薄中的准确位置。以操作该内存地址的数据。声明指针类型,必须先确定指向。
4+
5+指针类型前有个一`符号(^)`,如你要创建一个指向整型的指针,你可以这样做:
6+
7+``` pascal
8+type
9+ PointerType = ^integer;
10+```
11+
12+之后,声明变量类型为PointerType:
13+
14+``` pascal
15+ VAR p:PointerType;
16+```
17+
18+在使用前,你需要仅仅说明了p是一个指向整型变量单元的指针变量,但这个整型单元并不存在,在指针变量p中还没有具体的地址值。在程序中必须通过过程调用语句:new(p);才在内存中分配了一个整型变量单元并把这个单元的地址放在变量p中:
19+
20+``` pascal
21+ New (p);
22+```
23+
24+一个指针变量只能存放一个地址。在同一时间内一个指针只能指向一个变量单元。当程序再次执行new(p)时,又在内存中新建立了一个整型变量单元,并把新单元的地址存放在p中,从而丢失了旧的变量单元的地址。
25+
26+若要存取指针数据,在变量名后加`^`,如,指针类型赋值操作:
27+
28+``` pascal
29+p^ := 5;
30+```
31+
32+指针使用完后,要及时释放占用的内存空间。否则程序每次运行时,都将分配内存空间,直到使用完计算机全部空间。释放内存空间,使用:
33+
34+``` pascal
35+Dispose(p);
36+```
37+
38+指针可以指向指针,需要注意的是:只是一种指针指向,也就是说是种**地址**复制,并不是**值**复制。一旦你修改数据,其他指向该地址的指针也将变化。如果你释放了内存地址,其他的指针指向将失效。
39+
40+指针有什么好处?上面的例子有些牵强,为什么不使用整型而使用指针?指针的强大处在于与记录相结合,它能动态调整数据结构大小。如果你需要按顺序存储很多项数据,你可以使用数组,但是,数组大小固定,如果没有足够大的地方,你可能无法存下所有数据。
41+
42+动态数据结构,你只需要创建一个指向记录的数据类型,像,栈和队列都通过这种结构实现:
43+
44+``` pascal
45+type
46+ PointerType = ^RecordType;
47+ RecordType = record
48+ data : integer;
49+ next : PointerType;
50+end;
51+```
52+
53+next指向每个元素。 链中记录为[[Nil/zh CN|nil]]时,将表示没有记录。
54+
55+| | | |
56+|----|----|----|
57+| [[Basic Pascal Tutorial/Chapter 5/Records/zh CN|上一页]] | [[Basic Pascal Tutorial/Contents/zh CN|目录]] | [[Basic Pascal Tutorial/Chapter 6/Final words/zh CN|下一页]] |
58+
59+---
60+*From the Free Pascal wiki, page "Basic Pascal Tutorial/Chapter 5/Pointers/zh CN", as it stood on 2022-08-20 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history