一.类型指针的定义
对于指向特定类型的指针,在C中是这样定义的:
int *ptr;
char *ptr;在pascal中:
var
ptr: ^integer;
ptr: ^char;二.无类型的指针定义
在C中有void*类型,也就是指任何类型数据的指针在pascal中为其定义了一个专门的类型:pointer所以pascal中的:ptr: pointer 等价于 C中的: void *ptr三.指针的解除引用
要解除指针引用,即取出指针所指区域值
C中语法:(*ptr)pascal中语法:ptr^四.取地址(指针赋值)取某对象的地址并将起赋值给指针变量
C语法:
ptr=&object;
pascal语法: ptr:=@object;五.指针运算
在C中,可对指针进行移动运算
char a[20];
char *ptr=a;
prt++;
ptr+=2;
当执行ptr++,编译器会产生让ptr前进sizeof(char)步长的代码,之后prt+=2使得ptr前进两个步长在pascal中是这样:
var
a : array [0..20] of char;
ptr: pchar; //pchar 相当于^pchar
begin
ptr:=@a;
inc(ptr); //这句等价于 C 的 ptr++;
inc(ptr,2); //这句等价于 C 的 ptr+=2;
end;
只是在pascal中,只允许对有类型的指针进行这样的运算六.动态内存分配
在C中,用malloc()库函数分配内存,free()释放内存
int *ptr1,*ptr2;
int i;
ptr1 =(int*)malloc(sizeof(int)*20;
ptr2 =ptr; //保留原始指针位置
for (i=0;i<20;i++)
{
*ptr1=i;
ptr1++;
}
free(ptr2); 在pascal中,动态分配内存的函数为GETMEM(),释放函数为FREEMEM()传统pascal中获取内存的函数为NEW()和DISPOSE(),但NEW()只能获得对象的单个实体的内存大小,无法取得连续的存放多个对象的内存块,因此,与C对应的PASCAL代码以下:
var
ptr1,ptr2 :^integer;
i : integer;
begin
GetMem(ptr1,sizeof(integer)*20);
ptr2:=ptr1;
for i:=0 to 19 do
begin
ptr1^:=i;
inc(ptr1);
end;
FreeMem(Ptr2);
end;七.字符数组的运算
在C中,是没有字符串类型的,字符串是用字符数组来实现,于是也有一套一Str开头的库函数以进行字符数组的运算,如以下:
char str[15];
char *pstr;
strcpy(str,"teststr");
strcat(str,"_testok");
printf(pstr);
free(pstr);在pascal中:
var str: array [15] of char;
pstr: pchar;
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,"Funcation1");
pvfn(2);
FreeLibrary(hModule);}在Pascal中:
type
PVFN=Function (para:integer):integer;
var
fn:PVFN;
hm:HMODULE;
Begin
hm:=LoadLibrary('test.dll');
fn:=GetProcAddress(hm,'function1');
fn(2);
FreeLibrary(hm);
end;
对于指向特定类型的指针,在C中是这样定义的:
int *ptr;
char *ptr;在pascal中:
var
ptr: ^integer;
ptr: ^char;二.无类型的指针定义
在C中有void*类型,也就是指任何类型数据的指针在pascal中为其定义了一个专门的类型:pointer所以pascal中的:ptr: pointer 等价于 C中的: void *ptr三.指针的解除引用
要解除指针引用,即取出指针所指区域值
C中语法:(*ptr)pascal中语法:ptr^四.取地址(指针赋值)取某对象的地址并将起赋值给指针变量
C语法:
ptr=&object;
pascal语法: ptr:=@object;五.指针运算
在C中,可对指针进行移动运算
char a[20];
char *ptr=a;
prt++;
ptr+=2;
当执行ptr++,编译器会产生让ptr前进sizeof(char)步长的代码,之后prt+=2使得ptr前进两个步长在pascal中是这样:
var
a : array [0..20] of char;
ptr: pchar; //pchar 相当于^pchar
begin
ptr:=@a;
inc(ptr); //这句等价于 C 的 ptr++;
inc(ptr,2); //这句等价于 C 的 ptr+=2;
end;
只是在pascal中,只允许对有类型的指针进行这样的运算六.动态内存分配
在C中,用malloc()库函数分配内存,free()释放内存
int *ptr1,*ptr2;
int i;
ptr1 =(int*)malloc(sizeof(int)*20;
ptr2 =ptr; //保留原始指针位置
for (i=0;i<20;i++)
{
*ptr1=i;
ptr1++;
}
free(ptr2); 在pascal中,动态分配内存的函数为GETMEM(),释放函数为FREEMEM()传统pascal中获取内存的函数为NEW()和DISPOSE(),但NEW()只能获得对象的单个实体的内存大小,无法取得连续的存放多个对象的内存块,因此,与C对应的PASCAL代码以下:
var
ptr1,ptr2 :^integer;
i : integer;
begin
GetMem(ptr1,sizeof(integer)*20);
ptr2:=ptr1;
for i:=0 to 19 do
begin
ptr1^:=i;
inc(ptr1);
end;
FreeMem(Ptr2);
end;七.字符数组的运算
在C中,是没有字符串类型的,字符串是用字符数组来实现,于是也有一套一Str开头的库函数以进行字符数组的运算,如以下:
char str[15];
char *pstr;
strcpy(str,"teststr");
strcat(str,"_testok");
printf(pstr);
free(pstr);在pascal中:
var str: array [15] of char;
pstr: pchar;
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,"Funcation1");
pvfn(2);
FreeLibrary(hModule);}在Pascal中:
type
PVFN=Function (para:integer):integer;
var
fn:PVFN;
hm:HMODULE;
Begin
hm:=LoadLibrary('test.dll');
fn:=GetProcAddress(hm,'function1');
fn(2);
FreeLibrary(hm);
end;
char str[15];
char *pstr;
strcpy(str,"teststr");
strcat(str,"_testok");
printf(pstr);
free(pstr);在pascal中:
var str: array [15] of char;
pstr: pchar;
begin
strcopy(@str,'teststr');//在C中,数组的名称可以直接作为数组首地址指针来用,但Pascal不是这样的,因此 str前要加上取地址的运算符
strcat(@str,'_testok');
getmem(pstr,sizeof(char) *15);
strcopy(pstr,@str);
write(pstr);
freemem(pstr);
----------------------------------------------------------代码不对应。
C中没有分配内存