指针是什么?(300分)

  • 主题发起人 主题发起人 枯叶子
  • 开始时间 开始时间

枯叶子

Unregistered / Unconfirmed
GUEST, unregistred user!
具体回答一下.
 
指针是变量,数据结构等的地址
 
指针类型(pointer)
指针类型的变量指向内存空间的地址。定义形式如下:
type PointerName = ^typt;
下面的例子对指针的定义和使用进行了说明。
program Project1;
{$APPTYPE CONSOLE}
type
Pint=^integer; //定义指针类型
var
a:integer;
b:integer;
pt:Pint; //整形指针
p:pointer; //无类型指针
begin
a:=2;
b:=3;
pt:=@b; //整形指针指向整形数据
writeln('b=',pt^);
p:=@a; //无类型指针指向整形数据
// b:=p^; //不可以直接赋值给变量
b:=integer(p^); //无类型指针指向的内容给整形变量赋值
writeln('b=',b);
pt:=p; //指针间赋值
writeln('pt^:',pt^);
readln;
end.
运行结果如下:
b=3
b=2
pt^:2
程序说明:
将@运算符放在变量前面,将获取变量的地址,并可以把地址赋值为同样数据类型
的指针。把^运算符放在一个数据类型的前面,可以定义该类型的一个指针类型;如果放在一
个指针的后面,可以获取该指针指向的地址空间的内容。
例子中定义了一个无类型的指针p,它可以指向任何类型的数据,但使用过程中要
注意类型转换,不可以直接将所指地址中的内容直接赋值给其它类型变量。
为了方便使用者,在Object Pascal 语言中已经定义好了一些标准指针,程序员可以直接
使用。
Object Pascal 语言中的一些标准指针
指针类型所指变量的类型
Pstring,PAnsiString AnsiString
PbyteArray ByteArray
Pcurrecy Currency
Pextended Extended
PoleVariant OleVariant
PshortString ShortString
Pvariant Variant
PvarRec TvarRec(定义在System 单元中)
PtextBuf TextBuf(定义在SysUtils 单元中)
PwideString WideString
PwordArray TWordArray(定义在SysUtils 单元中)
 
指针也是一块内存变量,它的作用是指向一块确定的内存区,这个内存区存放着数据,比如整型,实型数据等等。
 
楼上各位说得都很好
多看看数据结构书籍!
 
指针就是一种特殊的变量,这个变量(指指针)里存放的是另一个变量的内存地址值。
 
指针的用途太广啦。对指针的理解是分过程的,初级-中级-高级
初级 就是指向内存的地址。
中级 看过VCL就知道,COM接口就是一个指向函数的指针。
高级 摸索当中。
 
指针的本质是一个32位整数(32计算机上)。它的值是它指向的地址。如果为0就是空指针
 
简单的说,指争就是指记录变量的内存地址!
 
见过指南针吗?
指南针是指南的磁铁
而指针是保存变量地址的变量
它有多种类型,具体看书……
 
枯叶子, 你上次好像问过了的,呵呵,我在其中学到了不少东东,先谢了
 
从别处转载有关对指针的解释:

其实查看一下以前的帖子都会有很多关于这方面的介绍,希望下面的简介对你有所帮助
祝你好运~:)
/////////////////////////////////
浅谈Object Pascal的指针
大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针。

以下内容分为八个部分,分别是
一、类型指针的定义
二、无类型指针的定义
三、指针的解除引用
四、取地址(指针赋值)
五、指针运算
六、动态内存分配
七、字符数组的运算
八、函数指针


一、类型指针的定义。对于指向特定类型的指针,在C中是这样定义的:
int *ptr;
char *ptr;
与之等价的Object Pascal是如何定义的呢?
var
ptr : ^Integer;
ptr : ^char;
其实也就是符号的差别而已。

二、无类型指针的定义。C中有void *类型,也就是可以指向任何类型数据的指针。Object Pascal为其定义了一个专门的类型:Pointer。于是,
ptr : Pointer;
就与C中的
void *ptr;
等价了。

三、指针的解除引用。要解除指针引用(即取出指针所指区域的值),C 的语法是 (*ptr),Object Pascal则是 ptr^。

四、取地址(指针赋值)。取某对象的地址并将其赋值给指针变量,C 的语法是
ptr = &Object;
Object Pascal 则是
ptr := @Object;
也只是符号的差别而已。

五、指针运算。在C中,可以对指针进行移动的运算,如:
char a[20];
char *ptr=a;
ptr++;
ptr+=2;
当执行ptr++;时,编译器会产生让ptr前进sizeof(char)步长的代码,之后,ptr将指向a[1]。ptr+=2;这句使得ptr前进两个sizeof(char)大小的步长。同样,我们来看一下Object Pascal中如何实现:
var
a : array [1..20] of Char;
ptr : PChar; //PChar 可以看作 ^Char
begin
ptr := @a;
Inc(ptr); // 这句等价于 C 的 ptr++;
Inc(ptr, 2); //这句等价于 C 的 ptr+=2;
end;

六、动态内存分配。C中,使用malloc()库函数分配内存,free()函数释放内存。如这样的代码:
int *ptr, *ptr2;
int i;
ptr = (int*) malloc(sizeof(int) * 20);
ptr2 = ptr;
for (i=0; i<20; i++){
*ptr = i;
ptr++;
}
free(ptr2);
Object Pascal中,动态分配内存的函数是GetMem(),与之对应的释放函数为FreeMem()(传统Pascal中获取内存的函数是New()和 Dispose(),但New()只能获得对象的单个实体的内存大小,无法取得连续的存放多个对象的内存块)。因此,与上面那段C的代码等价的Object Pascal的代码为:
var ptr, ptr2 : ^integer;
i : integer;
begin
GetMem(ptr, sizeof(integer) * 20);
//这句等价于C的 ptr = (int*) malloc(sizeof(int) * 20);
ptr2 := ptr; //保留原始指针位置
for i := 0 to 19 do
begin
ptr^ := i;
Inc(ptr);
end;
FreeMem(ptr2);
end;
对于以上这个例子(无论是C版本的,还是Object Pascal版本的),都要注意一个问题,就是分配内存的单位是字节(BYTE),因此在使用GetMem时,其第二个参数如果想当然的写成 20,那么就会出问题了(内存访问越界)。因为GetMem(ptr, 20);实际只分配了20个字节的内存空间,而一个整形的大小是四个字节,那么访问第五个之后的所有元素都是非法的了(对于malloc()的参数同样)。

七、字符数组的运算。C语言中,是没有字符串类型的,因此,字符串都是用字符数组来实现,于是也有一套str打头的库函数以进行字符数组的运算,如以下代码:
char str[15];
char *pstr;
strcpy(str, "teststr");
strcat(str, "_testok");
pstr = (char*) malloc(sizeof(char) * 15);
strcpy(pstr, str);
printf(pstr);
free(pstr);
而在Object Pascal中,有了String类型,因此可以很方便的对字符串进行各种运算。但是,有时我们的Pascal代码需要与C的代码交互(比如:用Object Pascal的代码调用C写的DLL或者用Object Pascal写的DLL准备允许用C写客户端的代码)的话,就不能使用String类型了,而必须使用两种语言通用的字符数组。其实,Object Pascal提供了完全相似C的一整套字符数组的运算函数,以上那段代码的Object Pascal版本是这样的:
var str : array [1..15] of char;
pstr : PChar; //Pchar 也就是 ^Char
begin
StrCopy(@str, 'teststr'); //在C中,数组的名称可以直接作为数组首地址指针来用
//但Pascal不是这样的,因此 str前要加上取地址的运算符
StrCat(@str, '_testok');
GetMem(pstr, sizeof(char) * 15);
StrCopy(pstr, @str);
Write(pstr);
FreeMem(pstr);
end;

八、函数指针。在动态调用DLL中的函数时,就会用到函数指针。假设用C写的一段代码如下:
typedef int (*PVFN)(int); //定义函数指针类型
int main()
{
HMODULE hModule = LoadLibrary("test.dll");
PVFN pvfn = NULL;
pvfn = (PVFN) GetProcAddress(hModule, "Function1");
pvfn(2);
FreeLibrary(hModule);
}
就我个人感觉来说,C语言中定义函数指针类型的typedef代码的语法有些晦涩,而同样的代码在Object Pascal中却非常易懂:
type PVFN = Function (para : Integer) : Integer;
var
fn : PVFN;
//也可以直接在此处定义,如:fn : function (para:Integer):Integer;
hm : HMODULE;
begin
hm := LoadLibrary('test.dll');
fn := GetProcAddress(hm, 'Function1');
fn(2);
FreeLibrary(hm);
end;
 
指针类型(pointer)
指针类型的变量指向内存空间的地址

把上面的文字多读多几扁,你就明白了。
 
指针就是内存地址的名称
 
看下面这个贴子去
http://www.delphibbs.com/delphibbs/dispq.asp?lid=884515
我对指针......
浅谈Object Pascal的指针
大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针。

以下内容分为八个部分,分别是
一、类型指针的定义
二、无类型指针的定义
三、指针的解除引用
四、取地址(指针赋值)
五、指针运算
六、动态内存分配
七、字符数组的运算
八、函数指针
.....
 
后退
顶部