null第7章 指针类型 第7章 指针类型 上章回顾:
类型定义语句
枚举类型
子界类型
集合类型null本章概要:
指针类型的声明
指针的运算
无类型指针
字符指针类型
动态存储结构的实现
7.1 循序渐进学理论 7.1 循序渐进学理论 指针构造和访问动态数据结构会更加灵活、方便。Windows API函数中使用了指针,学习基于Windiws平台的程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
,必然涉及与Windows的交互。7.1.1 指针类型的声明7.1.1 指针类型的声明声明指针类型的语法如下:
Type
〈指针类型标识符〉 = ^〈基类型〉;
其中,指针类型标识符即是指针类型名,基类型可以是简单类型,如整型、实型、字节型等,也可以是结构类型,如数组、
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
、集合等类型。
指针声明示例如下:
【例7-1】指针的简单定义
Type
Tr=^Integer;P1=^Real;
stu=Record
Name:String[10]; Age:Integer; Scores:real;
End;
BytePtr = ^ Byte;WordPtr = ^ stu;null【例7-2】指针的简单应用
Var
m:integer; //m为整型变量
x1,x2:^integer; // x1 ,x2为指向整型的指针变量
begin
m:=20;
x1:=@m;//将变量m的地址指定给x1
new(x2); //在内存中分配适于存储整型数据的存储单元,并将单元的地址写入指针x2中
x2^:=150;
dispose(x2); //释放由new分配的动态存储单元
end;null指针x1指针x21507.1.2 指针的运算7.1.2 指针的运算这里主要介绍用于指针运算的基本用法。
1. New过程
New是Object Pascal中的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
例程(在System单元声明),用于在应用程序中为动态变量分配一块区域,并把该区域的地址赋给指针变量。所分配区域的大小由指针所指的类型决定。
New过程的声明如下:
Proceddure New(var P:Pointer);
2. @操作符
@操作符是个一元操作符,用于获得操作数的地址,@后面的操作数可以是变量、过程、函数或类类型中的方法。null3. PTR函数
Ptr函数是Pascal中的标准例程(在System单元声明),用于把一个指定的地址转换为指针。
Ptr函数的语法为:
function Ptr(Address: Integer): Pointer;
其中Address是一个整数,用于表示一个32位地址,函数执行的结果是把32位地址转化为指针。
4. GetMem过程
GetMem过程也是Pascal中的标准例程(在System单元声明),类似于New,用于在应用程序堆栈中为动态变量申请一块指定大小的区域,并把该区域的地址赋予指针变量。
GetMem函数的语法为:
procedure GetMem(var P: Pointer; Size: Integer);
7.1.3 无类型指针7.1.3 无类型指针 无类型的指针是指指针变量在声明时没有指明基类型。无类型指针在声明中只使用Pointer。
例如:
var pAnyPoint:Pointer;
可以指向任何类型,但是不能用指针变量名后加^的形式来引用它的动态变量,如果引用需转换:
【例7-3】指针的简单应用
Type Tpint= ^ integer;
Var
M,n:integer; P:pointer; Pt:tpint
begin
m:=150; P:=@m;
Pt:=tpint(p); //将pointer类型进行转换
N:=pt
end;7.1.4 字符指针类型7.1.4 字符指针类型字符指针类型即PChar数据类型,是一个指向以NULL(不是零)字符结尾的字符(Char)串的指针。7.1.5 动态存储结构的实现7.1.5 动态存储结构的实现 指针常用来描述动态存储结构的实现。动态存储结构中较常用的有链表、堆栈、队列等存储结构。可以把堆栈和队列看成特殊的链表。
链表是一组元素的序列,链表中的元素通常称为节点,第一个节点称为表头,最后一个节点称为表尾。指向表头的指针称为头指针,在这个头指针中存放着表头的地址。节点一般用记录来描述,描述节点的记录至少含有两个域,一个域用来存放数据,称为值域;另一个域存放下一个节点的地址,称为指针域。如下图:null链表null1.链表的分类:
单向链表,双向链表,循环链表
2.链表可执行操作:
查找,插入,删除(任意位置)
3.特殊链表:
队列:先进先出链表
堆栈:先进后出链表null【例7-4】下列示例是一个关于在链表中利用指针处理字符串的程序。
如程序所示
nullType
PLink=^Node;
Node=Record
Data:string[30]; Next:Plink;
End;
Var DtRec:Plink; //声明全局变量
procedure TForm1.Button1listClick(Sender: TObject);
Var
p:Plink;
Begin
ListBox1.Clear; // 清列表框
P:=Dtrec;
{遍历链表,将数据赋给 ListBox1的Items属性) }
repeat
ListBox1.Items.Add(P^.Data); P:=P^.Next;
until P=Nil; end;nullprocedure TForm1.Button2delClick(Sender: TObject);
Var P,p1:Plink; i:Integer;
begin
i:=0; p:=Dtrec;
if P=NIL then showMessage('链表为空表!')
else //链表不空
if p^.data=Edit1.Text then // 第一个节点为要删除节点
begin DtRec:=P^.Next; P^.Next:=NIL; p:=Dtrec; end
else // 如果第一个节点不是要删除的节点
begin
p1:=P^.Next;
if P1<>NIL then
repeat
if P1.Data=Edit1.Text then // 找到一个要删除节点
begin P^.Next:=P1^.Next; P1:=P; i:=i+1; end
else Begin P:=P1; P1:=P1^.next; end
until P1=NIL;
if I=0 then ShowMessage('无匹配的数据');end; end;nullprocedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Var tempP,P:PLink;
begin
if Key=#13 then // 如果按下〈Enter〉键
Begin
new(tempP); // 创建一个节点
tempp^.Data:=Edit1.Text; tempP^.Next:=NIL;
if Dtrec=NIL Then // 如果链表为空表
begin NeW(Dtrec); DtRec:=tempP; end // 建链表
else // 如果链表不是空表
begin
p:=DtRec;
while p^.Next<>NIL do P:=P^.Next; // 找表尾
P^.Next:=tempP; // 将新节点添加到表尾
end;
Edit1.Clear; // 清编辑框
Edit1.SetFocus; // 当前活动焦点置回到编辑框上
end; end; end.7.2 上机练习重应用7.2 上机练习重应用练习:课本程序5-8null本章回顾:
指针类型的声明
指针的运算
无类型指针
字符指针类型
动态存储结构的实现