2010-09-23 71 views

回答

4

编辑 在C中,指向数组的指针和指针的指针与编译器有不同的含义(谢谢caf)。

在C数组中只是内存块。没有像Length(array)Low(array)High(array)这样的功能,您可以在Pascal阵列上使用。对于Pascal程序员的实际用途,C数组通常可以移植到Pascal指针,特别是在对各种API的函数调用中。

如果我们假设usigned char可以转换为德尔福byte,然后unsigned char *可以转化为^byte通常是通过type声明,可以像做:

type 
    PByte = ^byte; 
    PPByte = ^PByte; 

如果您正试图将一些C代码,特别是.h头文件然后看看headconv

+0

这就是我所想的,因为PByte已经存在了,我打算声明PPByte =^PByte并尝试。只是想要一些确认。 – MikeT 2010-09-23 21:49:41

+0

对不起,但你的第一句话是完全不正确的。一个指向数组的指针(例如'unsigned char(* x)[100]')被编译器视为非常不同的指针('unsigned char ** x')。前者指向100个字符的实际块;后者指向另一个指针值。 – caf 2010-09-23 23:59:13

+0

caf:你说得对,我编辑了我的答案,谢谢! – 2010-09-24 05:22:56

4

这两者在C中是一样的。但通常当你看到这些时,这是一个char指针数组。我会这样声明:

type 
    PAnsiCharArray = ^TAnsiCharArray; 
    TAnsiCharArray = array[0..0] of PAnsiChar; 

丑陋,但再次如此是大多数的东西,必须与C代码交互。它应该工作,但。

+0

在D2009 +中,您可以通过{$ POINTERMATH ON}避免这种混乱。 FPC永远有这个默认设置。 – 2010-09-23 18:53:55

2

它是一个指向指针的指针。

它是只有一个指向指针的指针。 {*}

但是指针索引约定意味着它可用于访问数组或指针。通常看到这件事的第一个地方是

int main(int argc, char** argv) 

,这是用它来索引到的char*秒(其中由OS管理的分配和结构化)的阵列的示例。


{*}因为数组和一个指针是 c中的同样的事情。当在指针上下文中使用时,数组会“衰减”到指针。

4

一个指向指针的指针和一个指向数组的指针是不是是一样的东西。

unsigned char** p1; 
unsigned char* p2[N]; 
unsigned char (*p3)[N]; 

p1是指向无符号字符的指针。它可以指向p2中的一个元素,这是一个指向unsigned char的指针数组。 p3是一个指向unsigned char数组的指针。Check out the C FAQ for more details.编辑:Here's a better example.

+3

这实际上只是分割头发,因为C没有真正的数组这样的东西,无论如何,只是指针和[索引语法]可以应用于它们使指针看起来像数组。出于所有实际目的,它们都是一样的。 – 2010-09-23 17:28:27

+2

他们不是。 'p3'和'p2'是不同的类型。它们之间不存在隐式转换,例如'p2'和'p1'的类型。从指针到数组的指针转换为指针指针(反之亦然)会导致程序崩溃。 – 2010-09-23 17:39:26

+0

在这个例子中编辑我的上面的评论来得太迟了:http://c-faq.com/aryptr/ptrtoarray.html – 2010-09-23 17:47:08

相关问题