指针的优点是处理速度快,而现在的电脑运行速度已经相当惊人了,并且还向更惊人的速度发展。在这种的硬件环境下,指针的处理速度已经显得不重要了,因此建议慎用指针,一旦把握不好,会弄巧成拙,造成系统崩溃。
用的比较多的可能算字符指针了,比如如下的代码:
var
P:Pchar;
ii:Integer;
begin
for ii:=0 to 99 do
begin
p[ii]:=Char(ii);
end;
end;
运行上面那段代码肯定会出现问题,因为这个P可能是个空指针,事先没有给它分配空间,所以不能赋值。可以改成下面代码:
var
P:Pchar;
ii:Integer;
begin
GetMem(p,100);
for ii:=0 to 99 do //留意不要超出给定地址的范围
begin
p[ii]:=Char(ii);
end;
FreeMem(p);
end;
指针还有一点值得注意,也是最重要的,一旦指针已分配给你,这个值是一个起始地址,这个起始地址以后的范围,可就全向你开放。在赋值时,不能超出已分配的空间范围。如果超出了,可能修改操作系统的重要数据,严重时将引起系统崩溃。
Pascal有一种Point类型,它叫无类型指针,即它只指示内存地址,而不管这个地址对应的是整数还是字符串,它有点类似于C语句中的void*类型。有类型指针用^符号声明,且声明在程序的Type说明符下,例如:
type
PInt=^Integer;
var
P:PInt;
nn:Integer;
begin
GetMem(p,100);
P^:=50; //给指针赋值
nn:=P^; //取出指针中的内容
Edit1.Text:=IntToHex(nn,0); //输出32,是十六进制
FreeMem(P);
end;
IntToHex(Value,Digits)函数是把整数转成16进位的AnsiString,Value是转换的整数,Digits是指16进制字符串的位数。(实际测试中,第二个参数好像不起作用,限制不了位数)
var
lpFarProc:FARPROC;
begin
.......
lpFarProc:=GetProcAddress(hComm,'MyFunc');
@MyFunc:=lpFarProc; //指针类型转换
MyFunc();
end;
从语法上讲一点问题没有,如果正常使用,也没有一点问题。但是,如果不正常使用呢?
我们不能说该程序有什么问题,但是至少它是不严谨的,它没有对指针是否为空指针进行判断,如果程序一旦运行,万一出现了空指针的情况,程序必死无疑。如果将程序稍微修改一下,加一个条件判断,隐患就消除了。
var
lpFarProc:FARPROC;
begin
lpFarProc:=GetProcAddress(hComm,'MyFunc');
if lpFarProc<>nil then
begin
@MyFunc:=lpFarProc; //指针类型转换
MyFunc();
end;
end;
这些看似简单的地方,最鞥体现一个程序设计者的水平。熟练的程序设计者为什么出现的错误比较少,关键在于他注意了一些细小的环节。