帮我说说什么是指针?(50分)

  • 主题发起人 主题发起人 任天笑
  • 开始时间 开始时间

任天笑

Unregistered / Unconfirmed
GUEST, unregistred user!
希望能有较为通俗的方式帮我解释,谢谢各位了!
 
帮你转一贴子:
delphi指针简单入门:

看一个指针用法的例子:
1 var
2 X, Y: Integer
// X and Y 整数类型
3 P: ^Integer
// P 指向整数类型的指针
4 begin
5 X :=17
// 给 X 赋值
6 P := @X
// 把 x的地址赋给p
7 Y := P^
// 取出p所指向的数值赋给y
8 end;

第二行定义了两个变量X,y. 第三行声明了p是指向整数类型的指针;意味着p能够指向x或者y的地址.第五行赋给x值,第六行把x的地址赋给p.最

后通过p指向的变量赋值给y.此时,x和y有相同的值.

操作符@用来取出变量的地址,也可以取出过程和函数的地址.

而符号^有两个目标,
当它出现在类型定义的前面时如 ^typename 表示指向这种类型的指针;
当它出现在指针变量后边时 如 point^ 返回指针指向的变量的值;

理解指针比较容易理解面向对象的pascal语言,因为指针经常在幕后操作.任何要求动态分配大的内存空间的类型可以用指针类型.例如

,long-string变量,实际在使用指针进行操作.另外一些高级的编程技术需要使用指针类型.
有时指针是适应object pascal严格的类型限制的唯一方法.同过一个通用的指针类型,通过类型转换成不同的指针类型,如下面的例子:
type

PInteger = ^Integer;
var
R: Single;
I: Integer;
P: Pointer
//通用的指针
PI: PInteger;
begin
P := @R
//取出R的内存地址
PI := PInteger(P)
//把通用类型转换成指向整数类型的指针
I := PI^;
end;

当然了,实数和整数的存储格式不同.这种赋值是把原始的二进制数据从R拷贝到I,而不进行转换.

保留字nil是一个特殊的常量可以赋给任何指针类型,当nil赋給一个指针时,指针什么也不指向,是一个空指针.

@操作符返回变量的内存中的存储地址,或者是过程/函数/方法;

1.如果变量,@X返回的是x的地址。如果编译选项{$T-}没有打开,着返回的事一个通用的指针,如果编译选项打开了,着返回的是x的类型对应的指

针.

2.如果是例程(过程/函数),@F返回的是F的入口点,@F的类型是一个指针。

3.当@用在类的方法中时,则方法的名称必须有类名,例如@TMyclass.Dosomething
指针指向TMyclass的dosomething方法。


当一个过程变量在赋值语句的左边时,编译器期望一个过程值在赋值语句的右边。这种赋值使得左边的变量可以指向右边定义的过程或者函数

入口点。换句话说,可以通过该变量来引用声明的过程或者函数,可以直接使用参数的引用。

var

F: function(X: Integer): Integer;
I: Integer;
function SomeFunction(X: Integer): Integer;
...
F := SomeFunction
// 给f赋值
I := F(4)
// 调用所指向的函数

在赋值语句中,左边变量的类型决定了右边的过程或者方法指针解释。

var

F, G: function: Integer;
I: Integer;
function SomeFunction: Integer;
...
F := SomeFunction
// 给f赋值
G := F
// 把F的值拷贝给G
I := G
// 调用函数

第一句获得函数的入口,第二句将指针复制,第三句获得函数的返回值。

有时候还可以这样使用
if F = MyFunction then ...;
在这里,F的出现导致一个函数调用;编译器调用F指向的函数,然后调用Myfunction,比较结果。这个规则是无论何时一个过程变量(

procedural variable)出现在一个表达式中,它表示调用所指向的函数或者过程。有时F指向一个过程(没有返回值),或者f指向一个需要参

数的函数,则前面的语句会产生一个编译错误。要比较F和Myfunction需要用
if @F = @MyFunction then ...;
@F把F转换成一个包含地址的无类型的指针变量,@myfunction返回myfunction的地址。
获得一个过程变量的内存地址使用@@。例如,@@F返回F的地址。

@操作符通常把一个无类型的指针值赋给一个过程变量,例如:
var StrComp: function(Str1, Str2: PChar): Integer;
...
@StrComp := GetProcAddress(KernelHandle, 'lstrcmpi');
调用GetProcAddres函数,用strcomp指向这个值
任何过程变量可以赋成nil,表示指证什么也不指向。但是试图调用一个nil值的过程变量导致一个错误,为了测试一个过程变量是否可以赋值

,用标准的赋值函数Assigned
if Assigned(OnClick) then OnClick(X);
 
还是觉得印象不深刻!有什么更好的?!谢谢!他
 
内存是一个酒店
里面每个房间是个内存单元
每个房间有个房间号,这是内存地址,也就是指针
举例
var
Person: Integer;
PPerson: Pointer;
...
那么定义了一个变量Person,它在内存中分配了一个地址,
那么Person相当于一个人,你要在酒店找到他需要知道他的房间号
PPerson := @Person;
那么指针PPerson相当于这个房间号

简单一句话,指针就是内存地址
 
指针就是变量的内存地址,指针变量就是定义这个指针的变量啊
 
谢谢各位了!
 
多人接受答案了。
 
后退
顶部