指针

指针

指针类型声明

使用 “^” 符号来表示指针:

1
2
3
4
5
6
type
TMyPtr = ^Integer; // TMyPtr 是指向整数的指针
//
var
ptr1: TMyPtr; // ptr2 指向 Integer 类型
ptr2: ^Double; // ptr2 指向 Double 类型

指针赋值

采用 “@” 取地址运算符,或者 Addr() 内置函数取得变量的地址,可以赋值给指针变量:

1
2
3
4
5
6
7
var 
value1: Integer;
ptr1: ^Integer;
//
value1 := 8;
ptr1 := @value1; // 用 @ 运算符取地址
ptr1 := Addr(value1); // 用 Addr 内置函数取地址

无类型指针

无类型指针为 Pointer,它不指向任何类型,pointer 需要使用时必须类型转换为其它类型的指针。

指针变量的使用

使用指针变量来访问指向的内存,需要用到 “^” 解指针操作符:

1
2
3
4
5
6
var 
value1: Integer;
ptr1: ^Integer;
//
ptr1 := @value1;
ptr1^ := 100; // ptr1 指向的整数赋值 100

New 和 Dispose

  • New() 内置函数,用于在堆中分配指定类型的内存,然后把地址赋值给指针。
  • Dispose() 内置函数,用于销毁回收 New() 分配的内存,指针会被设置为 nil
1
2
3
4
5
6
var 
ptr1: ^Integer;
//
New(ptr1); // 分配一个 Integer 占用大小空间,地址赋值给ptr1
ptr1^ := 10000 // 操作
Dispose(ptr1); // 释放,ptr1 被赋值为 nil

GetMem 和 FreeMem

  • GetMem() 函数,用于在堆中分配指定大小的内存,然后把地址赋值给指针。
  • FreeMem() 函数,用于销毁回收 GetMem() 分配的内存,指针会被设置为 nil
1
2
3
4
5
6
7
var 
ptr1: ^Integer;
//
GetMem(ptr1, 100 * SizeOf(Integer)); // 分配一个 100个Integer 占用大小空间,地址赋值给ptr1
// 其他操作
//
FreeMem(ptr1); // 释放

AllocMem

AllocMem 分配内存的形式跟 GetMem() 差不多,只需要传递字节大小,会通过返回值的方式返回指针:

AllocMem 会将分配到的内存全部初始化为 0。

AllocMem 分配到的内存同样使用 FreeMem() 来释放

1
2
3
4
5
6
7
var 
ptr1: ^Integer;
//
ptr1 := AllocMem(100 * SizeOf(Integer)); // 分配一个 100个整数占用大小空间,地址赋值给ptr1
// 其他操作
//
FreeMem(ptr1); // 释放

ReallocMem

GetMemAllocMem 分配得到空间的已有的指针,重新分配指定大小空间

1
ReallocMem(ptr, ReSize);

StrNew 和 StrDispose

分配字符串空间,并复制字符串到缓冲区,返回给 PChar

1
2
3
4
5
6
7
var ptr1 : PChar;

ptr1 := StrNew('Hello World');
//
// 使用 ptr1
//
StrDispose(ptr1); // 释放